我当时正在研究Java中的可重入锁。需要对这个概念进行某些澄清,即它实际上是如何工作的。下面是我所理解的代码片段:
class Test{
public synchronized a(){
some code;
b();
some code;
}
public synchronized b(){
some code;
}
}上面的代码有这个可重入锁问题的场景。
我在这里所理解的是,假设我们有两个线程:在测试共享对象上执行应用程序中的T1和T2。
无论T1或T2获取a()和b()上的锁获取。让我们先说T1,然后执行一个()。而a()控件的执行到达b();调用。现在在这种情况下,T1期望这个b()有一个新的锁,或者因为它已经锁定了b(),所以锁被跳过了。
需要帮助详细解释此行为以及上述代码中的问题。另外,可重入锁定机制将如何在这里提供帮助,以及代码片段和详细解释。
发布于 2018-10-27 21:44:32
可重入锁是允许线程在已经持有锁的情况下再次(多次)获取锁的锁。
例如,如果线程T1在对象上调用a(),则a()方法将获取对象上的锁,并开始执行主体。当a的主体调用b()时,b()调用“可重入地”获得相同的锁。当b()调用返回时,a()调用仍然持有锁。只有当a()调用返回时,才会释放锁。
(假设,如果Java原语锁不是可重入的,那么序列T1调用a(),然后调用b()可能会死锁,或者抛出异常...)
可重入锁通常使用引用计数来实现,它告诉锁定实现可重入性有多深。
发布于 2018-10-27 19:19:47
如果锁不是可重入的,线程就不能在持有进入a()时获得的锁的同时调用b()。
当a()被调用时,它调用了b(),你需要一个可重入的锁,否则线程将会活动锁,试图再次获取锁。当b()存在时,它不会释放锁,而是会递减计数器,而不是再次尝试获取锁。
https://stackoverflow.com/questions/53021263
复制相似问题