Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么;当线程调用d.wait时,它必须拥有d";的内在锁;?_Java_Multithreading_Wait - Fatal编程技术网

Java 为什么;当线程调用d.wait时,它必须拥有d";的内在锁;?

Java 为什么;当线程调用d.wait时,它必须拥有d";的内在锁;?,java,multithreading,wait,Java,Multithreading,Wait,我是Java新手,正在尝试学习保护块的概念。我从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

我是Java新手,正在尝试学习保护块的概念。我从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!");
}
以下是文章:

为什么这个版本的GuardeJoy是同步的?假设d是 我们用来调用wait的对象。当线程调用d.wait时,它 必须拥有d的内部锁-否则会引发错误。 在同步方法中调用wait是获取 内在锁

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

因为警察说必须

为什么?

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

你还需要担心比赛。例如,假设第三个线程也在同样的条件下等待,并且收到了不同的通知。。。而且刚刚被安排好。现在有两个线程都在检查条件。。。在同一类型。(注意,这仅适用于某些用例。)

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!");
}
javaoc说:“如果当前线程不是对象监视器的所有者,则抛出…
IllegalMonitorStateException
。”


您能告诉我在什么样的潜在情况下“当前线程不是对象监视器的所有者”吗

这将是当它没有通过输入
synchronized
块获得锁时。。。或同等产品

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

因为警察说必须

为什么?

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

你还需要担心比赛。例如,假设第三个线程也在同样的条件下等待,并且收到了不同的通知。。。而且刚刚被安排好。现在有两个线程都在检查条件。。。在同一类型。(注意,这仅适用于某些用例。)

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!");
}
javaoc说:“如果当前线程不是对象监视器的所有者,则抛出…
IllegalMonitorStateException
。”


您能告诉我在什么样的潜在情况下“当前线程不是对象监视器的所有者”吗


这将是当它没有通过输入
synchronized
块获得锁时。。。或同等产品。

谢谢您的宝贵意见。不过,我还有一个问题。您能告诉我在什么样的潜在情况下“当前线程不是对象监视器的所有者”吗?再次感谢您的帮助,“因为javadoc说它必须!”这不是一个有助于理解的答案。@dzjustinli“对象监视器的所有者”只是“在对象上同步的”的另一种说法。因为“那将是当它没有通过输入同步块…或等效对象来获得锁时。”,我假设这样一个例子是对的:一个线程通过调用anInstanceObject的同步GuardJoy()方法获得了anInstanceObject的锁,但在GuardJoy()方法中调用了另一个InstanceObject的wait方法?是的。线程必须拥有它正在调用的对象的监视器
wait
。感谢您提供的有用意见。不过,我还有一个问题。您能告诉我在什么样的潜在情况下“当前线程不是对象监视器的所有者”吗?再次感谢您的帮助,“因为javadoc说它必须!”这不是一个有助于理解的答案。@dzjustinli“对象监视器的所有者”只是“在对象上同步的”的另一种说法。因为“那将是当它没有通过输入同步块…或等效对象来获得锁时。”,我假设这样一个例子是对的:一个线程通过调用anInstanceObject的同步GuardJoy()方法获得了anInstanceObject的锁,但在GuardJoy()方法中调用了另一个InstanceObject的wait方法?是的。线程必须拥有它正在调用的对象的监视器
wait
on。为什么必须将我的问题标记为重复?你提出的另一个问题与我的不同!你为什么要把我的问题标记为重复的?你提出的另一个问题与我的不同!