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