volatile的两个作用:

    • 可见性
    • 防止指令重排序

    不保证原子性
    volitale的可见性底层使用缓存一致性协议来实现
    设置jvm内存屏障来实现防止指令重排序
    image.png
    底层C++ lock指令
    Lock前缀先对总线和缓存加锁,然后执行后面的指令,最后释放锁后会把高速缓存中的数据全部刷新回主内存。在Lock锁住总线的时候,其他CPU的读写请求都会被阻塞,直到锁释放。