happens-before原则

本文详细介绍了Java内存模型中的happens-before原则,包括其设计目的、定义以及六条规则,旨在保证多线程环境下程序的正确性和内存可见性。通过happens-before原则,可以理解Java如何限制编译器和处理器的重排序,以确保程序的执行结果不受影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

happens-before是JMM的核心,之所以设计happens-before,主要出于以下两个方面的因素考虑的:1)程序员的角度,JMM内存模型需要易于理解、易于编程;2)编译器和处理器的角度,编译器和处理器希望内存模型对其束缚越少越好,这样就可以根据自己的处理规则进行优化。但是这两个方面其实是相互矛盾的,因为JMM易于编程和理解就意味着对编译器和处理器的束缚就越多。

happens-before定义

基于上面的考虑,设计JMM时采用了一种折中的选择——JMM将需要禁止的重排序分为两类(因为编译器和处理器的优化大部分是重排序,所以JMM的处理的关键也就是重排序了):

  • 会改变程序执行结果的重排序
  • 不会改变程序执行结果的重排序

对应这两种情况,JMM采用了不同的策略:

  • 对于会改变程序执行结果的重排序,JMM要求编译器和处理器必须禁止这种重排序
  • 对于不会改变程序执行结果的重排序,JMM对编译器和和处理器不做任何要求(自然,编译器和处理器可以其进行重排序)

所以JMM的设计基于这样一种原则:先保证正确性,在考虑执行效率问题

说了这么多,与happens-before原则有什么关系呢?从上面可以看到JMM实际上可以看做是操作之间的约束模型,这种约束模型的实现就是我们要提到的happens-before了。happens-before**用来指定两个操作之间的执行顺序**,这两个操作可以在一个线程之内也可以在不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十六画生的博客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值