gpt4 book ai didi

java - 在这种情况下,notifyAll 将如何工作?

转载 作者:行者123 更新时间:2023-12-02 05:31:45 25 4
gpt4 key购买 nike

这是我编写的多线程队列的小片段,

synchronized void add(int i) {
if (count == size) {
System.out.println("******full***");
isQueueFull = true;
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("adding number: " + i);
val[end++] = i;
count++;
if (isQueueEmpty) {
isQueueEmpty = false;
this.notifyAll();
}
}



synchronized int remove() {
if (count == 0) {
isQueueEmpty = true;
System.out.println("******empty***");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int t = val[0];
for (int i = 0; i < end - 1; i++) {
val[i] = val[i + 1];
}
val[end - 1] = -1;
end--;
count--;

if (isQueueFull) {
isQueueFull = false;
this.notifyAll();
}
System.out.println("removing number: " + t);
return t;

}

假设我有四个线程添加到队列中,一个线程从队列中删除。在某一时刻,假设数组已满,我对添加到队列的所有四个线程调用 wait 。

现在,当一个元素被删除时,我需要在所有 hibernate 线程上调用notifyAll。(它给了我一个arrayOutofBound异常)我的问题是,在notifyAll的情况下线程的流程是怎样的。

由于add是synchronized方法,因此该方法中只能有一个线程执行。但由于等待,我们现在有四个线程在其中 hibernate 。那么在notifyAll上,所有四个线程是否仍然在add方法中(尽管它是一个同步方法)并执行?或者是按顺序一一完成,所有线程都被锁定,直到一个线程完成。

我在eclipse中调试它是非常困难的。我通过在 wait 之后放置 return 语句来解决 arrayOutOfBoundException 的问题,但我仍然想了解 notificationAll 情况下的流程?

最佳答案

等待与 sleep 有很大不同。 javadoc of wait()解释一下:

The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

(强调我的)

顺便说一句,它还包含一条您不遵守的严格规则:

As in the one argument version, interrupts and spurious wakeups are possible, and this method should always be used in a loop:

 synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}

因此,当调用 notifyAll() 时,4 个线程会竞争夺回监视器。一旦前一个释放了它,每个都将其取回,并继续执行。

关于java - 在这种情况下,notifyAll 将如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25472553/

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