可能重复:
Synchronization vs Lock
我想知道使用ReentrentLock和Synchronized(对象)有很大的不同吗?
为什么称它为reentrentLock?允许来自同一线程的重复呼叫?
答案 0 :(得分:9)
我想知道使用
ReentrantLock
和synchronized (object)
会有很大的不同。
主要区别是:
使用synchronized
,锁定/解锁与源代码的块结构相关联。无论您如何执行此操作,退出块时都会释放synchronized
锁定。例如,如果块由于意外异常而终止,它将被释放。
使用显式锁定不是这种情况,因此您可以在一种方法中获取ReentrantLock
(或任何其他Lock
)并在另一种方法中释放它。但另一方面,您必须记得在适当的时间/地点明确释放Lock
。如果你不这样做,你最终会陷入困境,并且(可能)陷入僵局。简而言之,ReentrantLock
更复杂,可能更容易出错。
使用synchronized
获得的原始锁定适用于Object.wait()
和Object.notify()
。 Lock
没有。
可以将ReentrantLock
创建为“合理”,这意味着等待获取给定锁的线程将以fifo顺序获取锁。原始锁是不公平的。
ReentrantLock
API具有可用于测试锁是否正在使用的方法,找出锁队列的长度,尝试获取锁而不阻塞以及其他各种事情。这些功能都不适用于原始锁。
为什么称它为折返锁定?允许来自同一线程的递归调用?
可重入锁允许持有锁的线程再次获取它。可能发生这种情况的方法之一是通过递归,但也有其他方法。
对于记录,synchronized
锁也是可重入的,因此您不必担心递归,或者线程可能获取已经存在的锁的其他情况。
答案 1 :(得分:1)