- 短暂的;易变的
- 保证线程可见性
- MESI
- 多个cpu之间的缓存一致性协议
- java线程之间的可见性通过硬件层面(cpu)的缓存一致性协议来完成
- java线程加了volatile之后每次写都会被线程读到
- 禁止指令重排序(cpu)
- cpu级别的重排序是禁止不了的(cpu用来提高效率),但是通过volatile可以禁止jvm语言级别的重排序===>读屏障、写屏障(loadfence之前的读结束之后后面的才能继续执行、storefence、读写屏障一块的指令)(cpu级别的、是cpu支持的、原语指令)
- cpu级别的线程可见性是通过cpu的缓存一致性协议来保证的
- DCL单例(单例模式的双重校验锁)
- Double Check Lock(volatile主要是为了保证指令的有序性而不是为了可见性)
- 超高并发的情况可能会产生相关问题===>秒杀时的订单,现在有了1000个订单,但是假如读到了中间为0的状态,就会造成订单变为1
- cpu的流水线技术===>cpu的指令重排序(汇编语言)
- 半初始化问题
- 测试方法:asm直接改写字节码文件,在对象初始化的三步(申请内存、初始化、引用指向内存)之间插入睡觉(sleep)的代码就可以测出来!
- volatile不能保证原子性,不能替代synchronized
- count值是保证可见性的,但是count++这个表达式是不能保证原子性操作的