编辑
2024-02-11
面试题库
0
请注意,本文编写于 346 天前,最后修改于 196 天前,其中某些信息可能已经过时。

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 许可协议。转载请注明出处!