我正在学习Java中的可重入锁。需要对这个概念进行一定的澄清,了解它是如何工作的。以下代码片段是我所理解的:
class Test{
public synchronized a(){
some code;
b();
some code;
}
public synchronized b(){
some code;
}
}
上面的代码存在可重入锁问题。
我的理解是,假设我们在 Test 共享对象上执行应用程序时有两个线程:T1 和 T2。
无论是 T1 还是 T2,都会同时获取 a() 和 b() 上的锁。假设 T1 首先获取锁并执行 a()。在执行 a() 时,控制流达到 b() 调用。此时,T1 期望为这个 b() 获取新的锁,或者由于它已经持有 b() 的锁,因此跳过锁定。
需要详细解释此行为以及以上代码中的问题。还需要详细解释可重入锁机制如何帮助解决问题,并提供片段和详细解释。
ReentrantLock
有额外的功能,这些功能无法通过synchronized
实现,例如tryLock
和公平锁定。如果您不需要这些额外的功能,我建议您使用普通的synchronized
。 - Peter Lawrey