Java 中的重入锁

我正在研究 Java 中的可重入锁定。需要对这个概念进行一定的澄清,了解它实际上是如何工作的。我对以下代码段的理解是什么:


class Test{

    public synchronized a(){   

       some code;

      b();

       some code;

    }

    public synchronized b(){    

       some code;

    }


}

上面的代码有这种可重入锁问题的场景。


我在这里的理解是,假设我们有两个线程:在测试共享对象上执行的应用程序中的 T1 和 T2。


T1 或 T2 获取锁的任何人都在 a() 和 b() 上获取锁。先说T1并执行a()。当 a() 控制的执行到达 b(); 称呼。现在,在这种情况下,T1 期望此 b() 的新锁,或者因为它已经锁定了 b(),因此跳过锁定。


需要有关此行为的详细解释以及上述代码中的问题的帮助。此外,可重入锁定机制将如何在此处提供帮助以及对此的片段和详细解释。


aluckdog
浏览 151回答 2
2回答

红颜莎娜

可重入锁是一种允许线程在已经持有锁时再次(多次)获取锁的锁。例如,如果线程T1调用a()一个对象,该a()方法获取该对象的锁,并开始执行主体。当a调用主体时b(),b()调用“可重入”获取相同的锁。当b()调用返回时,a()调用仍然持有锁。只有在a()调用返回时才会释放锁。(假设,如果 Java 原始锁不是可重入的,那么随后调用的序列T1调用可能会死锁或抛出异常......)a()b()可重入锁通常使用引用计数来实现,该引用计数告诉锁定实现可重入的深度。

慕慕森

如果锁不是可重入的,线程将无法b()在持有进入时获得的锁时调用a()。当a()被调用时,它调用b()你需要一个可重入的锁,否则线程会自己尝试第二次获取锁。它不会再次尝试获取锁,而是识别出它已经有一个锁b(),因此会增加一个计数器,这样当存在时,它不会释放锁而是递减计数器。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java