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

可能重复:
同步与锁定

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

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

我想知道使用ReentrantLocksynchronized (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