有序性的原因,和保证措施(as-if-serial)
- JVM执行代码时,可能会优化编译器和优化CPU的性能发挥,所以会进行对 代码顺序调整。当然,此顺序会保证as-if-serial(也就是再怎么优化顺序,单线程最终的结果不变。但是,多线程下,如果把代码顺序改变,可能会造成结果不同)
所以当多线程下,必须考虑是否要保证代码有序性!用volatile保证
可见性的原因:
由于CPU和内存的速度不同,所以要在他们中间加了一个缓存保证效率。
但是呢多个缓存之间可能存在缓存的数据不一致,这就是可见性
原子性
一个操作不能被打断,要么全部执行完毕,要么不执行。在这点上有点类似于事务操作,要么全部执行成功,要么回退到执行该操作之前的状态。
基本类型数据的访问大都是原子操作,long 和double类型的变量是64位,但是在32位JVM中,32位的JVM会将64位数据的读写操作分为2次32位的读写操作来进行,这就导致了long、double类型的变量在32位虚拟机中是非原子操作,数据有可能会被破坏,也就意味着多个线程在并发访问的时候是线程非安全的。
还有例子
read load write三个操作必须顺序执行,不能中断