聊聊指令重排
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;
}
}
}
}
程序运行结果:
1888490
本机测试,18万次后复现场景,当然实际情况应该用不了这么多次,因为出现指令重排的时候,另一个线程要正好CPU切换到指定代码处,条件比较苛刻。
结论:大家在多线程模式下,如果有依赖另一个线程的数据,一定要注意指令重排。
以上是 聊聊指令重排 的全部内容, 来源链接: utcz.com/z/513905.html