微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决谁知道密钥在多线程中可用?

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

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 举报,一经查实,本站将立刻删除。