谁承认密钥在多线程中可用?

xwbd5t1u  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(333)

这个问题在这里已经有答案了

什么是java中的监视器(8个答案)
4个月前关门了。
我对同步块中的锁机制有点困惑。
什么时候 Thread 尝试锁定同步块时,它会查找可用密钥(可以是类级别或示例级别)以锁定 synchronized 阻止。
我想知道告诉特定线程密钥可用的特定示例是什么?谁在玩游戏 receptionist 角色来确认线程请求以获取密钥,以便它可以锁定 synchronized 阻止?
有人能举个例子来解释一下吗?

jxct1oxe

jxct1oxe1#

没有接待员,工作起来更像浴室:每个人一进门就锁门,如果门锁上,人们就不会试图进入浴室:

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运行在哪个硬件上。

相关问题