我正在阅读内在锁的重入性,并发现了我无法理解的陈述:
如果同一线程再次获得锁定,则计数递增,并且当拥有线程退出同步块时,计数递减。当计数达到零时,锁定被释放。
当线程已经锁定(计数已设置为1)时递增计数的目的是什么?除了锁定实现之外,这还会影响其他方面吗?
以下示例在父方法中给出了等于2的计数。我是对的吗?
class A {
void a() {
synchronized (this) {
// 2 ?
}
}
}
class B extends A {
void b() {
// 0
synchronized (this) {
// 1
a();
}
}
}
有没有办法以编程方式获得此计数?
编辑:
我知道为什么我们需要增加/减少计数。我想我们可以检查一个Thread.holdsLock
并继续进行而不增加它是否为真。但是在退出“内部”同步块时,我们不知道当前同步块是否是“最外层”块。因此,我们不知道什么时候应该释放锁。
谢谢你们,伙计们。
答案 0 :(得分:4)
目的是防止在退出最外面的同步块之前释放锁。