• 用synchronized性能差不多,volatile一般不用
  • 作用
    • 没有原子性,可能写同一值
    • 变量在线程见可见性
      • 依靠CPU缓存一致性协议
    • 禁止指令重排序 # 用JVM的读写屏障
  • 修饰引用类型,内部属性不监控
  • DCL(Double Check Lock)单例volatile问题
  • private static volatile C c;    // 禁止了创建c指令重排序
    private C(){}
    public static C getInstance() {
        if (c == null) {
            synchronized (C.class) {
                if (c == null) {
                    // 申请内存(半初始化状态默认0),成员变量初始化,赋值
                    // 先赋值未初始化时,线程2判断非空,返回了半初始化状态的对象
                    c = new C();    
                }
            }
        }
        return c;
    }