public class OutOfOrderDemo {
private volatile static int a=0,b=0;
public volatile static int i=0,j=0;
public static void main(String[] args) throws InterruptedException {
int count=0;
while(true)
{
a=0;b=0;
i=0;j=0;
count++;
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
a=1;
i=b;
}
});
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
b=1;
j=a;
}
});
// 1和t2不一定会按照它们在代码中编写的顺序执行。这是因为在多线程环境中,JVM不保证指令的顺序和执行顺序,除非显式地使用同步操作来确保顺序性。
// 因此,t1和t2可能会以不同的顺序执行其操作,这可能会导致意外的结果。
t1.start();
t1.join();//t1优先执行完毕,优先结束
t2.start();//这样测试发现没有出现i=1,j=1的
t2.join();
System.out.println("i="+i+"j="+j);
if( i==0&&j==1)
{
System.out.println("正常"+count);
}
else {
System.out.println("不正常============="+count+";"+i+" "+j);
break;
}
}
}
}
这样跑出来目前没发现有问题。
但是按理来说是有可能出问题的:t1,t2之间的执行顺序会有可能颠倒之类
volatile禁止重排序针对的是变量的赋值,但是不能保证现成的执行顺序造成的i=0,j=1之外的情况(之前出现了i=1,j=0)不知道这么理解对不对?
单线程按顺序执行,会出现这样的指令重排序造成的问提嘛?