谁知道密钥在多线程中可用?

问题描述

我对同步块中的锁定机制感到困惑。

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