Java高并发-Volatile

  1. 概念
    1. 轻量级的同步机制
  2. 特征
    1. 保证可见性
      1. 在某个线程改变变量时及时通知其他线程该变量已被修改
    2. 不保证原子性
      1. 非线程安全
      2. 解决方法
        1. 在并发包中提供了多种解决方法,如在进行number++时,可使用AtomicInteger实现增减操作
          1. 原理:CAS/自旋锁
        2. 使用sync
    3. 禁止指令重排
      1. 指令重排
        1. 单线程确保最终执行结果和程序顺序一致
        2. 处理器在进行重排时必须考虑指令的数据依赖性
        3. 多线程环境下由于编译器优化,指令执行顺序会变化,无法确定两个线程使用的变量的一致性
      2. volatile禁止指令重排的原理
        1. 内存屏障(内存栅栏)
          1. 保证特定操作的执行顺序
          2. 保证某些变量的内存可见性(利用该特性实现volatile内存可见性)
        2. 使用
          1. 通过插入内存屏障禁止在内存屏障前后的指令执行重排优化
          2. 强制刷出CPU缓存数据(及时通知)
      3. 案例
        1. 单例模式
          1. DCL双端检索机制 存在指令重排的可能性
            1. 原因:正常情况是先初始化再有一个指针指向该内存空间,有可能在指令优化之后在指向内存空间时,实际对象的初始化还未完成
            2. 解决:
              public class SingletonDemo {
                  private static volatile SingletonDemo instance = null;
              
                  private SingletonDemo() {
                      System.out.println(Thread.currentThread().getName() + "构造方法");
                  }
              
                  //DCL双端检索机制 存在指令重排的可能性
                  public static SingletonDemo getInstance() {
                      if (instance == null) {
                          synchronized (SingletonDemo.class) {
                              if (instance == null) {
                                  instance = new SingletonDemo();
                              }
                          }
                      }
                      return instance;
                  }
              }
              

               

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值