先看代码
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中就算出现指令重排也不会打印出结果的,就这里我不理解。有没有大神来帮忙扫扫盲?
能看出来对线程的运行原理理解还不够,当线程使用start()方法之后,其执行顺序就已经变得不可预测了.
在此例中,线程1和2的start代码运行完之后,
在执行到线程1和线程2的join方法之间的cpu运行效率足够支撑线程1和线程2先运行数次,
而这数次的顺序是不可预测了,如果需要从开始就决定线程顺序,可以百度**线程排序**。
有其他问题可以向我提问,如果该回答解决了你的问题,我的博客可能也会在某些时候对你起到帮助。
你这个是多线程问题...指令重排是 a=1;
flag=true;这两行执行的顺序