JMM 通过以下机制保证内存可见性,确保线程对共享变量的修改对其他线程可见:
volatile 关键字:
确保变量的读/写操作具有原子性: 对于单个 volatile 变量的读/写操作,JMM 会确保它们具有原子性。
禁止重排序:
JMM 会禁止特定类型的编译器和处理器重排序,例如禁止将 volatile 写操作重排序到 volatile 写之后。
引入内存屏障:
JMM 在 volatile 变量的读/写操作前后插入内存屏障,确保内存操作的顺序。
synchronized 关键字:
锁机制: 线程进入同步代码块或方法时,会获取对象的监视器锁,确保只有一个线程能够执行同步代码块或方法。
释放锁时的内存操作: 线程释放锁时,JMM 会将该线程对应的本地内存中的共享变量刷新到主内存中,确保其他线程能够看到最新的值。
获取锁时的内存操作: 线程获取锁时,JMM 会将该线程对应的本地内存置为无效,从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。
happens-before 规则:
定义操作之间的执行顺序: JMM 定义了 happens-before 关系,它表明如果一个操作 happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见。 指导编译器和处理器进行合法的重排序: JMM 要求编译器和处理器遵守 happens-before 规则,确保重排序后的执行结果与 happens-before 关系指定的顺序一致。
原子操作:
CAS 操作: 原子地更新变量的值,并检查是否成功。
原子类: 提供对基本类型和引用类型的原子操作支持,例如 AtomicInteger、AtomicReference。
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!