gpt4 book ai didi

java - 为什么线程的 resume 和 suspend 方法应该同步?

转载 作者:行者123 更新时间:2023-11-30 08:58:36 26 4
gpt4 key购买 nike

我不是在谈论已弃用的 resume 和 suspend 方法。 在我没有使用 synchronized 关键字之前。我在一本书上看到他们使用了 synchronized 关键字,我试了一下,效果很好。你能解释一下为什么这种方法行得通而不使用 synchronized 行不通吗?还有为什么 while(suspendFlag) 循环也应该在同步块(synchronized block)中?

class myThread extends Thread {
boolean suspendFlag;

myThread(String name) {
//some contructor
suspendFlag = false;
}

public void run() {
//simple loop
for (int i = 0; i < 11; i++) {
//do some thing
synchronized(this){
while (suspendFlag) {
wait();
}
}
}
}

synchronized void resumeThread(){
suspendFlag = false;
notify();
}

synchronized void suspendThread() {
suspendFlag = true;
}

}

最佳答案

  1. 之所以在 while 循环之前同步是因为 wait 方法,因为它需要在调用之前拥有对象的互斥量。 wait根据 java 文档的方法说:

    The current thread must own this object's monitor. 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.

  2. 为什么您的代码需要同步而不是没有同步:

    您可能正在从多个线程访问同一个 MyThread 对象的 getter 和 setter 方法,其中一个线程将读取 suspendFlag 的值,而其他线程可能会修改 suspendFlag 的值,而该值可能对另一个线程不可见,因此可能会产生竞争条件。

关于java - 为什么线程的 resume 和 suspend 方法应该同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27579236/

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