1、 关键字volatile的主要作用是使变量在多个线程间可见,但无法保证原子性,对于多个 线程访问同一个实例变量需要加锁进行同步。
2、 虽然volatile只能保证可见性不能保证原子性,但用volatile修饰long和double可以 保证其操作原子性。
所以从Oracle Java Spec里面可以看到:
1、对于64位的long和double,如果没有被volatile修饰,那么对其操作可以不是原子的。 在操作的时候,可以分成两步,每次对32位操作。
2、 如果使用volatile修饰long和double,那么其读写都是原子操作
3、 对于64位的引用地址的读写,都是原子操作
4、 在实现JVM时,可以自由选择是否把读写long和double作为原子操作
5、 推荐JVM实现为原子操作
Was this helpful?
0 / 0