我对同步块中的锁定机制感到困惑。
Thread
尝试锁定同步块时,都会寻找可用键(可以是类级别或实例级别)来锁定synchronized
块。
我想知道告诉特定线程密钥可用的那个特定实例是什么?谁扮演receptionist
的角色来确认线程请求以获取密钥,以便它可以锁定synchronized
块?
任何人都可以通过示例分享任何简单的解释吗?
答案 0 :(得分:1)
没有接待员,它的工作方式更像是浴室:所有人进入时都将门锁好,如果门被锁着,人们就不会尝试进入浴室:
while door is locked
wait
lock the door
do your business
unlock the door
如果只有一个人可以成功锁定门(即在放下裤子之前,我们先检查自己是否在浴室里),那么该方法就可以成功。
在IT方面,JVM会执行以下操作:
class Monitor {
AtomicReference owner = new AtomicReference();
void lock() {
do {
boolean alone = owner.compareAndSet(null, Thread.currentThread());
if (alone) {
return;
}
wait();
} while (true);
}
void unlock() {
if (owner.compareAndSet(Thread.currentThread(), null)) {
return;
} else {
throw new IllegalMonitorStateException();
}
}
}
AtomicReference.compareAndSet
委托给特殊的硬件指令,该指令仅在先前的值符合预期时才更新内存位置。硬件确保该指令是原子的,即,在该指令执行时,另一条指令无法更改该存储位置。所使用的硬件指令的详细信息取决于JVM在哪个硬件上运行。