我想知道使用
ReentrantLock和会有很大的不同synchronized (object)。
主要区别在于:
- 与
synchronized
锁定/解锁绑定到源代码的块结构。synchronized
无论您如何执行此操作,退出块时都会释放一个锁。例如,如果块由于意外的异常而终止,它将被释放。
使用显式锁定不是这种情况,因此您可以在一种方法中获取一个
ReentrantLock(或任何其他
Lock)并在另一种方法中释放它。但另一方面,您
必须
记住
Lock在适当的时间/地点显式释放。如果不这样做,您将最终陷入困境,甚至陷入僵局。简而言之,
ReentrantLock它更复杂,并且更容易出错。
您获得的原始锁定
synchronized
可用于Object.wait()
和Object.notify()
。Lock
不。ReentrantLock
可以将A 创建为“公平”的,这意味着等待获取给定锁的线程将按fifo顺序获取锁。原始锁是不公平的。该
ReentrantLock
API的方法可用于测试锁是否正在使用,找出锁队列的长度,尝试不加阻塞地获取锁以及其他各种方法。此功能均不可用于原始锁。
为什么将其称为可重入锁?允许来自同一线程的递归调用?
可重入锁允许持有锁的线程再次获取它。可能发生这种情况的一种方法是通过递归,但是还有其他方法。
作为记录,
synchronized锁也是可重入的,因此您不必担心递归或线程可能获取其已持有的锁的其他情况。



