我正在研究 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(),因此跳过锁定。
需要帮助详细解释此行为以及上述代码中的问题。此外,可重入锁定机制将如何在此处提供帮助以及对此的片段和详细解释。

最佳答案

可重入锁是一种允许线程在已经持有锁时再次(多次)获取锁的锁。

例如,如果线程 T1 调用对象上的 a(),则 a() 方法获取对象上的锁,并开始执行主体。当 a 的主体调用 b() 时,b() 调用“可重入”获取相同的锁。当 b() 调用返回时,a() 调用仍然持有锁。只有当 a() 调用返回时才会释放锁。

(假设,如果 Java 原始锁不是可重入的,那么序列 T1 调用 a() 然后调用 b() 可能会死锁,或者抛出异常......)

可重入锁通常使用引用计数来实现,该引用计数告诉锁定实现可重入的深度。

另见:https://stackoverflow.com/a/16504266/139985

10-08 10:59