gpt4 book ai didi

java - 等待线程完成任务是否可能出现这样的竞争条件?

转载 作者:行者123 更新时间:2023-11-30 06:34:09 25 4
gpt4 key购买 nike

很明显我对并发缺乏经验,我正在这里寻求帮助。

我正在用 Java 编写一个多线程应用程序,而我却被一个疑问所困扰。请查看此示例代码(混合伪代码和 Java):

头1体(部分):

/* It creates and starts thread Thread 2 */
if (!thread2.taskCompleted)
thread2.wait();
/* continue execution... */

Thead 2 主体:

class Thread2 extends Thread {

volatile boolean taskCompleted = false;

public void run() {
/* It executes a complex task... */
taskCompleted = true;
notifyAll(); // notify waiting threads
}

}

我的担心很简单:如果语句按该顺序执行会发生什么:

  1. 线程 1 启动线程 2
  2. 线程 2 做了一些事情,但没有完成任务
  3. 线程 1 将 taskCompleted 读取为 false
  4. 线程 2 完成任务,引发 taskCompleted 标志,并通知(无人)
  5. 线程 1 开始等待。永无止境。

如果您有任何想法和/或这是一个众所周知的场景(完全重复?),请告诉我

最佳答案

taskCompleted标志和wait()/nofiyAll()的使用必须被锁保护以避免你描述的场景.

/* It creates and starts thread Thread 2 */
synchronized (thread2) {
if (!thread2.taskCompleted)
thread2.wait();
}
/* continue execution... */

class Thread2 extends Thread {

boolean taskCompleted = false;

public void run() {
/* It executes a complex task... */
synchronized (this) {
taskCompleted = true;
notifyAll(); // notify waiting threads
}
}
}

关于java - 等待线程完成任务是否可能出现这样的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7348826/

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