如何解决谁知道密钥在多线程中可用?
我对同步块中的锁定机制感到困惑。
Thread
尝试锁定同步块时,都会寻找可用键(可以是类级别或实例级别)来锁定synchronized
块。
我想知道告诉特定线程密钥可用的那个特定实例是什么?谁扮演receptionist
的角色来确认线程请求以获取密钥,以便它可以锁定synchronized
块?
任何人都可以通过示例分享任何简单的解释吗?
解决方法
没有接待员,它的工作方式更像是浴室:所有人进入时都将门锁好,如果门被锁着,人们就不会尝试进入浴室:
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在哪个硬件上运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。