Java 为什么;当线程调用d.wait时,它必须拥有d";的内在锁;?
我是Java新手,正在尝试学习保护块的概念。我从Java教程oracle中看到了下面的代码和语句。我的问题是: 1) 为什么“当线程调用d.wait时,它必须拥有d的内在锁” 2) 该声明还提到,“否则将抛出错误”。抛出了什么样的错误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
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。为什么必须将我的问题标记为重复?你提出的另一个问题与我的不同!你为什么要把我的问题标记为重复的?你提出的另一个问题与我的不同!