java内存模型

内存模型

为了应用程序能够避免数据竞争的干扰,java5引入了明确定义的java内存模型,其中最重要的一个概念就是happens-before关系,happens-before关系是用来描述两个操作的内存可见性的,如果X happens-before 操作Y,那么X的结果对于Y可见。

在同一个线程中,字节码的先后顺序也暗含了happens-before关系:在程序控制流路径中靠前字节码 happens-before 靠后的字节码,然而,并不是前者一定在后者之前执行,实际上,如果后者没有观测前者的运行结果,即后者没有数据依赖于前者,那么它们可能被重排序。

线程间的happens-before关系:1,2,3,4,5,6(todo)

具备传递性,如果X happens-before 操作Y,而操作Y happens-before 操作Z,那么操作X happens-before 操作Z。

如果两次赋值操作之间没有数据依赖,即时编译器、处理器可以对其进行重排序。如何解决指令重排序的问题,为a,b字段设置volatitle字段。

java内存模型的底层实现

通过内存屏障来禁止指令重排序

例如volatitle字段,所插入的内存屏障不允许volitatile字段写操作之前的内存访问被重排序到他的后面,也不允许volatile字段读操作之后的内存访问被重排序至其之前。

未完待续。。。

锁,volatile字段,final字段与安全发布

final实例字段涉及新建对象的发布问题,当一个对象包含final实例字段时,我们希望其他线程只能看到已初始化的final实例字段。因此即时编译器会在final字段的写操作后插入一个写写屏障,以防某些优化将新建对象的发布重排序 到 该字段的写操作之前。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值