Dmi*_*iyd 5 java volatile thread-safety
我不明白我读过的那些陈述:
因为访问volatile变量永远不会持有锁,所以它不适合我们想要读取update-write作为原子操作的情况(除非我们准备"错过更新");
这是什么意思,我不能读 - 更新 - 写?
我什么时候想使用volatile而不是简单的boolean.在C#中,我记得我可以使用一个简单的静态bool来控制线程何时启动和停止,但在java中我需要使用标识符"volatile":
> public class StoppableTask extends Thread {
private volatile boolean pleaseStop;
public void run() {
while (!pleaseStop) {
// do some stuff...
}
}
public void tellMeToStop() {
pleaseStop = true;
}
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*hev 11
这句话说的是这个例子:
public class CounterClass {
private volatile int counter;
public int increment() {
return counter++;
}
}
Run Code Online (Sandbox Code Playgroud)
尽管是counterhas volatile修饰符,但如果两个线程访问该increment()方法将返回两个不同的整数,则无法保证.因为counter++操作不是原子的.是的get, increment, return.两个线程可能increment()同时调用,第一个线程处于get阶段,第二个线程处于get第一个线程处于阶段之前的increment阶段.
总结:volatile不保证原子性或其他.它只是保证当您访问变量时,您将不会收到旧的缓存值.但它不保证任何线程安全性或原子性.
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |