可见性,并非原子的

写入volatile变量会直接写入主内存

不加volatile,cpu会从缓存中读取值,而不是主内存中读取。因为工作内存(缓存)和主内存的交互的时间(1微秒)足够cpu执行3000条左右的指令。
image.png

从volateile 变量读取会直接读取主内存

非常弱的同步机制

禁止指令重排

编译器和处理器都可能堆指令进行重排,导致问题

  1. // 指令重排, 为了效率编译器可能会先 执行最后一条指令,在执行第二条,这就是指令重排
  2. int a = 1;
  3. a++;
  4. int b = 2;

有同步的时候无需volatile

synchronized/Lock/AtomicInteger

image.png