Skip to content

前置知识

CPU多级缓存架构 JMM内存模型 MESI协议 本质上是使用了CPU的 高速缓存一致性协议 缓存一致性协议 需要了解

能干嘛

  1. 保证多线程之间的数据可见性 2. 堆内存是所有线程共享里面的内存,除了共享的内存之外呢, 每个线程都有自己的专属的区域, 都有自己的工作内存,如果说在共享内存里有一个值的话, 当我们某一个线程都要去访问这个值的时候,就会将这个值Copy一份到自己的工作空间里, 然后对这个值的任何改变, 首先是在自己的空间进行改变, 什么时候歇会去, 就是改完之后会马上歇会去, 什么时候去检查有没有新的值 也不好控制 3. 在这个县城里发生的改变,并没有及时的反映到另外一个线程里面, 这就是线程之间的不可见, 对这个变量值增加了volatile之后就能保证一个线程的改变,另一个线程马上就能看到
  2. 禁止指令重排序(CPU)
    1. DCL单例
    2. DoubleCheckLock (二次检查锁)
      1. LoadFence 源语指令
      2. StoreFence 源语指令 解释一下什么是指令重排序 以及为什么要禁止指令重排序
    3. CPU为了提升效率, 他把指令 并发的来执行,第一个指令执行到一半的时候 第二个指令可能就已经开始工作了,这叫流水线式的执行,在这种新的架构设计基础之上,想充分的利用这一点, 那么就要求你的编译器把你的源码编译完的指令 进行一个 指令的重新排序

详解重排序 重排序有三种类型 内存重排序: CPU 中的 L1/L2/L3 级高速缓冲区读取的字节数据, 可能会导致看起来是乱序执行的 指令重排序 : CPU 指令可以多条并行, 不存在数据依赖的情况下会进行指令的重排 编译重排序 : 编译器在不改变单线程语义的情况下, 可以进行指令的重排

waitingresult.com