我不理解我读到的那几个语句:
因为访问一个volatile变量从不持有锁,所以它不适用于我们想要将读取-更新-写入作为原子操作的情况(除非我们准备“错过更新”);
这是什么意思,我无法进行读取-更新-写入?
什么时候需要使用volatile而不是简单的布尔值。在C#中,我记得可以使用简单的静态布尔值来控制线程的启动和停止,但在Java中,我需要使用标识符“volatile”:
> public class StoppableTask extends Thread {
private volatile boolean pleaseStop;
public void run() {
while (!pleaseStop) {
// do some stuff...
}
}
public void tellMeToStop() {
pleaseStop = true;
}
}
volatile
。(您不会再将其设置为false了,对吧?)要在Java中编写更容易/更安全/更健康的并发代码,请查看java.util.concurrent。它具有线程管理类,还有一个AtomicBoolean。 - Thilovolatile
!没有它,不能保证线程会看到标志被设置为true
。实际上,某些编译器优化甚至可能从循环中删除条件并使其成为一个无限循环。 - Philipp Wendlervolatile
,你可能会造成无限循环。 - Petar Minchev