【发布时间】:2012-02-05 03:45:01
【问题描述】:
我想知道使用 ReentrentLock 和 Synchronized(object) 有很大区别吗?
为什么叫reentrentLock?允许来自同一个线程的递归调用?
【问题讨论】:
-
@skaffman - 这个问题不涉及“可重入”主题。
标签: java
我想知道使用 ReentrentLock 和 Synchronized(object) 有很大区别吗?
为什么叫reentrentLock?允许来自同一个线程的递归调用?
【问题讨论】:
标签: java
我想知道使用
ReentrantLock和synchronized (object)是否有很大区别。
主要区别在于:
使用synchronized,锁定/解锁与源代码的块结构相关联。无论您如何执行此操作,当您退出该块时都会释放synchronized 锁。例如,如果块由于意外异常而终止,它将被释放。
如果使用显式锁定,情况并非如此,因此您可以在一种方法中获取ReentrantLock(或任何其他Lock)并在另一种方法中释放它。但另一方面是您必须记得在适当的时间/地点明确释放Lock。如果你不这样做,你最终会遇到卡住的锁,并且(可能)死锁。简而言之,ReentrantLock 更复杂,可能更容易出错。
使用synchronized 获得的原始锁定适用于Object.wait() 和Object.notify()。 Locks 不要。
ReentrantLock 可以被创建为“公平”的,这意味着等待获取给定锁的线程将按照 fifo 顺序获取锁。原始锁是不公平的。
ReentrantLock API 有一些方法可以用来测试锁是否在使用中,找出锁队列的长度,尝试在不阻塞的情况下获取锁,以及其他各种事情。这些功能都不适用于原始锁。
为什么叫可重入锁?允许来自同一个线程的递归调用?
可重入锁允许持有锁的线程再次获取它。发生这种情况的一种方式是通过递归,但也有其他方式。
作为记录,synchronized 锁也是可重入的,因此您无需担心递归或线程可能获取它已经持有的锁的其他情况。
【讨论】: