Java内存模型和happes-before规则

JMM内存模型介绍

由于cpu的处理速度远远大于主存的读写速度,为了平衡这之间的差距,每个cpu都有自己的缓存(工作内存)。cpu处理数据的时候,会先从主存读取数据到自己的工作内存中,在自己的工作内存中进行修改,最后再写回主存。
Java内存模型
因此可能出现线程不安全问题:如果线程A在自己的本地内存修改了共享变量后,没有及时写回主存,那么线程B从主存读到的数据会是脏数据。这可以通过线程同步或者volatile关键字来解决。

重排序

例如·:

double pi = 3.14 //A
double r = 1.0 //B
double area = pi * r * r //C

这是一个计算圆面积的程序,它的执行顺序可能是A->B->C,也可能是B->A->C。因为AB之间不存在数据依赖,编译器和处理器为了加快处理速度,可能将它们重新排序。

happens-before原则
  1. 从程序员角度出发:以计算圆的面积的代码为例,happens-before保证了A happens-before B,B happens-before C,A happens-before C,即A操作的操作结果对B可见。注意,这仅仅是对程序员的保证。
  2. 从JMM角度出发:happens-before并不代表禁止重排序。它保证的是代码结果的一致性。A与B之间没有数据一来关系,他们可以进行重排序,但是无论这么排序,最终结果都一致。这就是从JMM角度出发的happens-before。程序员并不关心代码执行的顺序是怎么样的,只关心结果是不是相同。所有只要happens-before能得出正确的结果,那么它怎么重排序都可以。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值