不卖关子,答案是具有原子性,但是在某些情况下也没有原子性。
1.具有
准确的说volatile 是具有可见性的,其核心原理是当对volatile标记的变量进行修改时,会将其他缓存的
线程中的的变量值清除。当其他缓存中的线程读取此变量值时,会首先向主线程中缓存获取到消息,将新值传给当前线程并赋值。每次变量更新volatile变量时都会重复此步骤。
所以,从这种
意义上来说,入门书籍《Java编程思想》告诉我们。,定义long或double变量时,如果使用volatile
关键字,就会获得(简单的赋值与返回操作)原子性。
2.不具有
但是volatile有个条件,用在getAnd
Operator场合是不具备原子性的。比如在做n =n+1,n++这种。因为在执行此类操作时有三个步骤:获取,自增,赋值。其jvm指令中,有
内存屏障的介入,内存屏障会将已经发生写入的值
同步到各个线程内存中。
因此在此种情况下不具备原子性。