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