Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';使用ReentrentLock和Synchronized(对象)有什么区别?_Java - Fatal编程技术网

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()
    Object.notify()
    <代码>锁定
    s不锁定

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

  • ReentrantLock
    API提供了一些方法,可以用来测试锁是否正在使用,找出锁队列的长度,尝试在不阻塞的情况下获取锁,以及其他各种事情。这些功能都不适用于基本锁

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

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


请注意,
synchronized
锁也是可重入的,因此您不必担心递归,也不必担心线程可能获得它已经持有的锁的其他情况。

@skaffman-这个问题不包括“可重入”主题。