happens-before

happens-before

一、happens-before 规则的含义

happens-before 是 Java 内存模型(JMM)中用于定义多线程之间操作顺序的规则集合。它规定了如果一个操作 A happens-before 另一个操作 B,那么 A 的结果对 B 可见,并且在 B 执行之前 A 必须已经完成

  1. 程序顺序规则:一个线程中的每个操作,happens-before 于该线程中的任意后续操作。

    • 例如,在一个线程中,先执行操作 A,再执行操作 B,那么操作 A happens-before 操作 B。
  2. 监视器锁规则:对一个锁的解锁,happens-before 于随后对这个锁的加锁。

    • 当一个线程释放锁时,它在临界区内所做的修改对后续获取该锁的线程可见。
  3. volatile 变量规则:对一个 volatile 域的写,happens-before 于任意后续对这个 volatile 域的读。

    • 确保对 volatile 变量的写操作对后续的读操作可见。
  4. 传递性:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。

    • 可以通过传递关系建立更复杂的操作顺序。

二、happens-before 规则的作用

  1. 保证内存可见性:确保一个线程对共享变量的修改能够被其他线程正确地看到。

    • 例如,没有 happens-before 规则,一个线程对共享变量的修改可能会被缓存在本地内存中,而其他线程无法看到这个修改。
  2. 防止指令重排序:确保在多线程环境下,程序的执行顺序符合开发者的预期。

    • 编译器和处理器可能会对指令进行重排序以提高性能,但 happens-before 规则限制了这种重排序,以保证程序的正确性。

三、用比喻理解 happens-before 规则及适用场景

可以把一个 Java 程序的执行想象成一个办公室的工作场景。

  1. 程序顺序规则:

    • 就像一个员工在一天的工作中,先完成一个任务 A,再去做任务 B。任务 A 的结果自然会在任务 B 开始之前就存在,并且对任务 B 可见。比如,先填写一份报告,然后把报告交给领导。填写报告这个操作 happens-before 交给领导这个操作。
  2. 监视器锁规则:

    • 想象办公室里有一个重要的会议室,只有拿到钥匙(锁)的人才能进入。当一个人离开会议室并把钥匙交出来(解锁),然后另一个人才能拿到钥匙进入会议室(加锁)。第一个人在会议室里做的工作(对共享资源的修改)对第二个人进入会议室后是可见的。适用于多个线程需要协调对共享资源的访问的场景,比如多个员工需要轮流使用会议室进行重要讨论。
  3. volatile 变量规则:

    • 假设办公室里有一个特殊的公告板(volatile 变量),当有人在公告板上写下一条重要消息(写操作),那么后续任何一个人去看公告板(读操作)都能看到这条消息。适用于需要快速在多个线程之间传递关键信息的场景,比如有一个紧急任务的状态需要多个员工及时了解。
  4. 传递性:

    • 就像一个任务链,任务 A happens-before 任务 B,任务 B happens-before 任务 C,那么任务 A 自然也 happens-before 任务 C。比如员工甲完成任务 A 后交给员工乙,员工乙完成任务 B 后交给员工丙,那么员工甲的工作结果对员工丙也是可见的。在复杂的多线程程序中,通过传递性可以建立起多个操作之间的正确顺序关系。

程序员基于该规则提供内存可见性保证来编程

相关推荐
IT_Octopus20 分钟前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
长征coder1 小时前
【无标题】
java·性能优化
新时代牛马2 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet2 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
sunshine22 girl3 小时前
Java学习一 环境配置2 Idea的入门使用和maven配置,项目启动脚本配置
java·maven
有点。3 小时前
*C++哈夫曼树与哈夫曼编码
java·c++·servlet
CRMEB系统商城4 小时前
CRMEB标准版系统(Java)v3.1正式发布
java·spring·微信小程序·php·教育电商
写后端的胖头鱼4 小时前
【高频面试题】Java 基础类型 + 包装类 + String 互相转换
java·开发语言
weixin_460443564 小时前
企业考试系统从.NET迁移到Java+Linux:数据库迁移、接口兼容与灰度切换实践
java·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统·一人一档
香菜TTT5 小时前
Redis的哨兵机制
java·数据库·redis