防止指令重排只能防止volatile关键字变量之前的操作的不重排。
而且不要加在引用变量上,加在x,y上因为a,b已经发生指令重排了,所以x,y读取的是指令重排后的a,b是不起作用的。
AtomicInteger那些自增用的就是他volatile
贴上代码大家去玩吧、
package example;
/**
* description:
*
* @author: he QQ: 905845006
* @email: [email protected]
* @date: 2020/4/14 9:18 PM
*/
public class Hello {
static int a;
static int b;
volatile static int x;
volatile static int y;
public static void main(String[] args) throws InterruptedException {
int i=0;
for(;;){
i++;
a=0;b=0;x=0;y=0;
Thread one=new Thread(new Runnable() {
@Override
public void run() {
a=1;
x=b;
}
});
Thread two=new Thread(new Runnable() {
@Override
public void run() {
b=1;
y=a;
}
});
one.start();
two.start();
one.join();two.join();
if (x==0&&y==0){
System.out.println(a+"--------"+b);
System.out.println("第"+i+"次("+x+","+y+")");
break;
}
}
}
}