java中的volatile标识符

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不保证原子性或其他.它只是保证当您访问变量时,您将不会收到旧的缓存值.但它不保证任何线程安全性或原子性.