跳到主要内容

volatile如何实现内存可见

  • volatile 关键字是 Java虚拟机 提供的最轻量级的同步机制,作为一个修饰符出现,用来修饰变量

volatile 如何保证可见性

  • 内存变化:
    • volatile 时:
      无 volatile
      sign 没有 volatile 修饰时,线程01对变量进行操作,线程02并不会拿到变化的值
    • volatile 时:
      有 volatile
      signvolatile 修饰时,线程01对变量进行操作时,会把变量变化的值强制刷新到主内存,线程02获取值时,会把自己内存中的 sign 值设为过期,从主内存中读取

反编译解读可见性

  • 编译后的汇编指令中,有 volatile 和没有 volatile 的主要差别在于多了一个 lock addl $0x0,(%rsp),也就是lock的前缀指令,lock指令相当于一个内存屏障,主要保障三点:
    1. 将本处理器的缓存写入内存
    2. 重排序时不能把后面的指令重排序到内存屏障之前的位置
    3. 如果是写入动作会导致其他处理器中对应的内存无效
      主要通过1、3保证被修饰变量的内存可见性

不加 volatile 也可见吗

  • 在没 volatile 修饰时,JVM也会尽量保证可见性,在有 volatile 修饰时,一定保证可见性