聊聊指令重排

编程

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切换到指定代码处,条件比较苛刻。

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

以上是 聊聊指令重排 的全部内容, 来源链接: utcz.com/z/513905.html

回到顶部