qq_43078102 2019-04-11 21:46 采纳率: 0%
浏览 914

小白求助,java中对于指令重排的理解。

先看代码

public class HappenBefore {
    private static int a=0;
    private static boolean flag=false;
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(()->{
            a=1;
            flag=true;
        });
        Thread t2=new Thread(()->{
            if(flag){
                a*=1;
            }
            //指令重排
            if(a==0){
                System.out.println("happen before->"+a);
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
    }
}

最后运行的结果是有时会打印出指定内容,但是我不理解的是。既然我将t1先通过join()方法合并了。逻辑上应该是a的值已经在t1中更改为了1,线程t2中就算出现指令重排也不会打印出结果的,就这里我不理解。有没有大神来帮忙扫扫盲?

  • 写回答

2条回答 默认 最新

  • 永寂如孤星 2019-04-16 02:19
    关注

    能看出来对线程的运行原理理解还不够,当线程使用start()方法之后,其执行顺序就已经变得不可预测了.
    在此例中,线程1和2的start代码运行完之后,
    在执行到线程1和线程2的join方法之间的cpu运行效率足够支撑线程1和线程2先运行数次,
    而这数次的顺序是不可预测了,如果需要从开始就决定线程顺序,可以百度**线程排序**。

    有其他问题可以向我提问,如果该回答解决了你的问题,我的博客可能也会在某些时候对你起到帮助。

    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配