数字重排 java,聊聊指令重排 - my_juke的个人空间 - OSCHINA - 中文开源技术交流社区...

重现指令重排

指令重排是CPU的操作,一般容易出现的地方是在多线程模式,单线程不会有问题。 出现指令重排一般是前后两个操作互为独立。比如a=1,b=2 单看这两条指令,就有可能出现重排。

private static int a =0;

private static boolean flag = false;

private static int s = 5;

public static void main(String\[\] args) throws InterruptedException {

int j = 0;

for(;;){

Thread t2 = new Thread(new T2());

Thread t1 = new Thread(new T1());

Thread t3 = new Thread(new T2());

t2.start();;

t1.start();;

t3.start();;

t2.join();

t1.join();

a=0;

flag = false;

j++;

if(s == 0){

break;

}

}

System.out.println(j);

System.out.println(s);

}

public static class T1 implements Runnable{

@Override

public void run() {

a = 1;

flag = true;

}

}

public static class T2 implements Runnable{

@Override

public void run() {

if(flag){

// System.out.println("ok "+a);

if(a == 0){

s = 0;

}

}

}

}

程序运行结果:

188849

0

本机测试,18万次后复现场景,当然实际情况应该用不了这么多次,因为出现指令重排的时候,另一个线程要正好CPU切换到指定代码处,条件比较苛刻。

结论:大家在多线程模式下,如果有依赖另一个线程的数据,一定要注意指令重排。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值