java中如何保证代码特定情况下不乱序

如何保证代码特定情况下不乱序

硬件保证

内存屏障

x86中:
①sfence:也就是save fence,写屏障指令。在sfence指令前的写操作必须在sfence指令后的写操作前完成。
②lfence:也就是load fence,读屏障指令。在lfence指令前的读操作必须在lfence指令后的读操作前完成。
③mfence:在mfence指令前得读写操作必须在mfence指令后的读写操作前完成。

原子指令

lock指令等

jvm级别规范(JSR133)

  • loadload 屏障: load-loadload-load
  • storestore屏障 :store-storestore-store
  • loadstore 屏障: load- loadstore-store
  • storeload屏障 : store- storeload-load

java代码中volatile保证有序性

public class CatTest {
    int test;
    volatile int count;
}

字节码层次:
在这里插入图片描述
jvm层次
volatile内存区读写都加读写

loadload
volatile 读
loadstore

storestore
volatile 写
storeload

硬件层次
windows lock指令实现
不同的操作系统实现细节不同

java代码中synchronized保证有序

public class CatTest {
    public  CatTest(){
        synchronized (this){

        }
    }
}

字节码层次:
在这里插入图片描述

jvm层次:
c c++调用了操作系统提供的同步机制

操作系统层次:
x86: lock cmpxchg xx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值