保证线程可见性

可见性问题:

java是有堆内存的,是所有线程共享的内存,每个线程又有自己专属的内存区域。当堆内存里有一个变量a=true,线程去访问这个变量值时,会在自己那块内存复制一份。也就是当多个线程同时访问一个值时,会出现不同步情况,线程间不可见

解决方案:

volatile:不保证原子性(读可见,但是会重复写)
MESI
CPU缓存一致性协议

禁止指令重排序

DCL单例(双重检查)

Object o = new Object() : 创建对象的过程

  1. 给对象申请内存空间(这时候对象的成员变量是系统默认值,如:int a = 0;)
  2. 对对象的成员变量初始化(a = 10)
  3. 把对象内容赋值给o变量

指令重排序可以将2和3指令位置调换,使对象赋值给o时,不是期望值10,从而出错

loadfence

stroefence