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

时间:2012-01-08 00:23:35

标签: java

  

可能重复:
  Synchronization vs Lock

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

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

2 个答案:

答案 0 :(得分:9)

  

我想知道使用ReentrantLocksynchronized (object)会有很大的不同。

主要区别是:

  • 使用synchronized,锁定/解锁与源代码的块结构相关联。无论您如何执行此操作,退出块时都会释放synchronized锁定。例如,如果块由于意外异常而终止,它将被释放。

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

  • 使用synchronized获得的原始锁定适用于Object.wait()Object.notify()Lock没有。

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

  • ReentrantLock API具有可用于测试锁是否正在使用的方法,找出锁队列的长度,尝试获取锁而不阻塞以及其他各种事情。这些功能都不适用于原始锁。

  

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

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

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

答案 1 :(得分:1)