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