我正在研究 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