原子性:最小操作执行单元,不可中断分割。int类型是原子的,long不一定是,因为long的赋值是两次赋值才能完成,
对于32位操作系统来说,单次操作能处理的最长长度为32bit,而long类型8字节64bit,所以对long的读写都要两条指令才能完成(即每次读写64bit中的32bit)。如果JVM要保证long和double读写的原子性,势必要做额外的处理。
JVM规范中,没有规定一定要原子性,32位的HotSpot没有把long和double的读写实现为原子操作。
对于64big的环境来说,单次操作可以操作64bit的数据,即可以以一次性读写long或double的整个64bit,所以是原子的。
可见性:是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。volatile变量修饰保证了可见性,但不能保证原子性。 某些需要同步的场景,若可用volatile,它比synchronized 快,因为不需要做线程上下文切换。
内存屏障
内存屏障,又称内存栅栏,是一组处理器指令,用于实现对内存操作的顺序限制