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