gpt4 book ai didi

java - 为什么是 "when a thread invokes d.wait, it must own the intrinsic lock for d"?

转载 作者:行者123 更新时间:2023-12-02 03:55:42 24 4
gpt4 key购买 nike

我是 Java 新手,正在尝试学习 protected block 的概念。我在Java教程oracle中看到了下面的代码和语句。我的问题是:

1) 为什么“当一个线程调用 d.wait 时,它必须拥有 d 的内在锁”?

2) 该声明还提到,“否则会抛出错误”。抛出什么样的错误?

public synchronized void guardedJoy() {
// This guard only loops once for each special event, which may not
// be the event we're waiting for.
while(!joy) {
try {
wait();
} catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}

这是文章:

Why is this version of guardedJoy synchronized? Suppose d is the object we're using to invoke wait. When a thread invokes d.wait, it must own the intrinsic lock for d — otherwise an error is thrown. Invoking wait inside a synchronized method is a simple way to acquire the intrinsic lock.

最佳答案

1) why "when a thread invokes d.wait, it must own the intrinsic lock for d"?

因为javadoc说必须!

为什么?

那么,waitnotify 的主要目的是实现条件变量等。一般来说,一个线程等待其他线程通知它某些共享状态已更改。如果等待线程不必在锁内等待,那么就不能保证第二个线程所做的状态更改是可见的……根据 Java 内存模型。

您还需要担心比赛。例如,假设第三个线程也在等待相同的条件并收到不同的通知......并且刚刚被调度。现在您有两个线程都在检查同一类型的条件...。 (请注意,这仅适用于某些用例。)

2) the statement also mentioned, "otherwise an error is throw". What kind of error is thrown?

javaoc 说:“抛出... IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。”

<小时/>

Could you please tell me under what kind of potential circumstances that 'the current thread is not the owner of the object's monitor'?

那就是当它没有通过输入synchronized block ...或等效的方式获取锁时。

关于java - 为什么是 "when a thread invokes d.wait, it must own the intrinsic lock for d"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35482659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com