可能重复:
同步与锁定
我想知道使用ReentrentLock和Synchronized(对象)有很大的不同吗?
为什么它被称为reentrentLock?允许来自同一线程的重复呼叫?
Ste*_*n C 10
我想知道使用
ReentrantLock和有很大的不同synchronized (object).
主要区别是:
随着synchronized锁定/解锁绑定到您的源代码的块结构.一synchronized,当你退出块,不管你怎么做这个锁将被释放.例如,如果块由于意外异常而终止,它将被释放.
使用显式锁定不是这种情况,因此您可以在一个方法中获取ReentrantLock(或任何其他Lock方法)并在另一个方法中释放它.但另一方面,你必须记住Lock在适当的时间/地点明确释放.如果你不这样做,你最终会陷入困境,并且(可能)陷入僵局.简而言之,ReentrantLock更复杂,可能更容易出错.
你得到的原始锁定synchronized与Object.wait()和Object.notify(). Lock不要.
A ReentrantLock可以创建为"公平",这意味着等待获取给定锁的线程将以fifo顺序获取锁.原始锁是不公平的.
该ReentrantLockAPI具有可用于测试锁是否是在使用时,发现锁队列的长度,试图获取锁不阻塞的方法,以及各种其他的东西.这些功能都不适用于原始锁.
为什么它被称为折返锁?允许来自同一线程的递归调用?
可重入锁允许持有锁的线程再次获取它.可能发生这种情况的方法之一是通过递归,但也有其他方法.
对于记录,synchronized锁也是可重入的,因此您不必担心递归,或者线程可能获取已经存在的锁的其他情况.