被volatile 修饰的变量 不存在原子性 ,因为他的读操作和写操作是分开的,所以并不是线程安全的.

    必须同时满足下面两个条件才能保证在并发环境的线程安全:

  (1)对变量的写操作不依赖于当前值。

比方说  i++  就会失效  但是 q= b+1  ;b用volatile  修饰就没事

  (2)该变量没有包含在具有其他变量的不变式中。

比如

​int a = 0;​

​int b = a+1;​

​for (int i = 0; i < 10; i++) {b++;} 这里的b不用用volatile 修饰​

最大的特性是内存可见性,

保证各线程每次访问的时候都是最新的修改的变量值.一般的变量对象被存在主内存中(共享),线程要用的时候会把这个对象拷贝一份到自己的工作内存,在工作内存中操作该变量,在操作完之后再写道主内存中.