Java 什么';使用ReentrentLock和Synchronized(对象)有什么区别?
可能重复:Java 什么';使用ReentrentLock和Synchronized(对象)有什么区别?,java,Java,可能重复: 我想知道使用ReentrentLock和Synchronized(对象)有很大的区别吗 为什么它被称为reentrentLock?允许来自同一线程的Recrive调用吗 我想知道使用ReentrantLock和synchronized(object)是否有很大区别 主要区别在于: 使用synchronized时,锁定/解锁与源代码的块结构相关联。退出块时,synchronized锁将被释放,无论您如何操作。例如,如果块由于意外异常而终止,它将被释放 对于显式锁定,情况并非如此,因
我想知道使用ReentrentLock和Synchronized(对象)有很大的区别吗 为什么它被称为reentrentLock?允许来自同一线程的Recrive调用吗 我想知道使用
ReentrantLock
和synchronized(object)
是否有很大区别
主要区别在于:
- 使用
时,锁定/解锁与源代码的块结构相关联。退出块时,synchronized
锁将被释放,无论您如何操作。例如,如果块由于意外异常而终止,它将被释放 对于显式锁定,情况并非如此,因此您可以在一种方法中获取synchronized
(或任何其他可重入锁定
),然后在另一种方法中释放它。但另一方面,您必须记住在适当的时间/地点显式释放锁定
锁。如果你不这样做,你将以一个卡住的锁,和(可能)死锁而告终。简而言之,
更复杂,并且可能更容易出错ReentrantLock
- 通过
获得的基本锁定可用于synchronized
和Object.wait()
<代码>锁定s不锁定Object.notify()
- 可以创建一个“公平”的
,这意味着等待获取给定锁的线程将以fifo顺序获取锁。原始锁是不公平的ReentrantLock
API提供了一些方法,可以用来测试锁是否正在使用,找出锁队列的长度,尝试在不阻塞的情况下获取锁,以及其他各种事情。这些功能都不适用于基本锁ReentrantLock
请注意,
synchronized
锁也是可重入的,因此您不必担心递归,也不必担心线程可能获得它已经持有的锁的其他情况。@skaffman-这个问题不包括“可重入”主题。