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语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题