gpt4 book ai didi

java - 我可以同步控制变量的读取吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:44:21 26 4
gpt4 key购买 nike

下面的代码可以工作,但我有点不喜欢必须编写 isRunning() 方法:

class Test {
private boolean running;
public void startX() {
synchronized(this) {
running = true
}
while (isRunning()) {
//do something
}
}
public synchronized void stopX() {
running = false;
}
private synchronized boolean isRunning() {
return running;
}
}

我能否以某种其他方式在 while (running){} 中同步读取 running 变量,还是必须编写 isRunning() 方法?同样的问题也适用于其他控制变量,例如

for (;running;) {}

if (running) {}

在所有这些情况下,您似乎被迫编写无意义的方法来获得正确的同步。我错过了什么吗?

最佳答案

如果您只是重置running 的值一次以指定停止,您可以使用volatile 关键字。

但是,如果你需要多次启动和停止,这就不行了。这是因为可变字段“可能会错过更新”

这是一个链接,用于解释 volatile 在这种情况下何时起作用 link

这是该链接的代码示例,以防它失效:

public class StoppableTask extends Thread {
private volatile boolean pleaseStop;

public void run() {
while (!pleaseStop) {
// do some stuff...
}
}

public void tellMeToStop() {
pleaseStop = true;
}
}

如果需要多次启动和停止,则需要使用 Java 5 并发锁对象之一或显式同步

关于java - 我可以同步控制变量的读取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533159/

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