使用ReentrentLock和Synchronized(对象)有什么区别?

use*_*949 9 java

可能重复:
同步与锁定

我想知道使用ReentrentLock和Synchronized(对象)有很大的不同吗?

为什么它被称为reentrentLock?允许来自同一线程的重复呼叫?

Ste*_*n C 10

我想知道使用ReentrantLock和有很大的不同synchronized (object).

主要区别是:

  • 随着synchronized锁定/解锁绑定到您的源代码的块结构.一synchronized,当你退出块,不管你怎么做这个锁将被释放.例如,如果块由于意外异常而终止,它将被释放.

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

  • 你得到的原始锁定synchronizedObject.wait()Object.notify(). Lock不要.

  • A ReentrantLock可以创建为"公平",这意味着等待获取给定锁的线程将以fifo顺序获取锁.原始锁是不公平的.

  • ReentrantLockAPI具有可用于测试锁是否是在使用时,发现锁队列的长度,试图获取锁不阻塞的方法,以及各种其他的东西.这些功能都不适用于原始锁.

为什么它被称为折返锁?允许来自同一线程的递归调用?

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

对于记录,synchronized锁也是可重入的,因此您不必担心递归,或者线程可能获取已经存在的锁的其他情况.