【问题标题】:What's the difference in using ReentrentLock and Synchronized(object)? [duplicate]使用 ReentrentLock 和 Synchronized(object) 有什么区别? [复制]
【发布时间】:2012-02-05 03:45:01
【问题描述】:

可能重复:
Synchronization vs Lock

我想知道使用 ReentrentLock 和 Synchronized(object) 有很大区别吗?

为什么叫reentrentLock?允许来自同一个线程的递归调用?

【问题讨论】:

  • @skaffman - 这个问题不涉及“可重入”主题。

标签: java


【解决方案1】:

我想知道使用ReentrantLocksynchronized (object) 是否有很大区别。

主要区别在于:

  • 使用synchronized,锁定/解锁与源代码的块结构相关联。无论您如何执行此操作,当您退出该块时都会释放synchronized 锁。例如,如果块由于意外异常而终止,它将被释放。

    如果使用显式锁定,情况并非如此,因此您可以在一种方法中获取ReentrantLock(或任何其他Lock)并在另一种方法中释放它。但另一方面是您必须记得在适当的时间/地点明确释放Lock。如果你不这样做,你最终会遇到卡住的锁,并且(可能)死锁。简而言之,ReentrantLock 更复杂,可能更容易出错。

  • 使用synchronized 获得的原始锁定适用于Object.wait()Object.notify()Locks 不要。

  • ReentrantLock 可以被创建为“公平”的,这意味着等待获取给定锁的线程将按照 fifo 顺序获取锁。原始锁是不公平的。

  • ReentrantLock API 有一些方法可以用来测试锁是否在使用中,找出锁队列的长度,尝试在不阻塞的情况下获取锁,以及其他各种事情。这些功能都不适用于原始锁。

为什么叫可重入锁?允许来自同一个线程的递归调用?

可重入锁允许持有锁的线程再次获取它。发生这种情况的一种方式是通过递归,但也有其他方式。

作为记录,synchronized 锁也是可重入的,因此您无需担心递归或线程可能获取它已经持有的锁的其他情况。

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 2019-12-06
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多