测试逻辑
首先默认为x =0; y =0; a =0; b =0;然后开启两个线程;
线程1执行:a =888; x = b;
线程2执行:b =888; y = a;
有且只有x = b,y = a两个同时先执行,才会出现x=y=0。
所以测试是否存在x=y=0观察指令是否会出现重排现象。
1.
2.
3.
4.
5.
6.
7.
public class OrderTest {
private static int x =0, y =0;
private static int a =0, b =0;
public static void main(String[] args) throws InterruptedException{
for(long i =0; i <Long.MAX_VALUE; i++){
x =0; y =0; a =0; b =0;
CountDownLatch countDownLatch = new CountDownLatch(2);
Thread one = new Thread(new Runnable(){
@Override
public void run(){
a =888;
x = b;
countDownLatch.countDown();}});
Thread two = new Thread(new Runnable(){
@Override
public void run(){
b =888;
y = a;
countDownLatch.countDown();}});
one.start();
two.start();//等待计数器变为0,即等待所有异步线程执行完毕
countDownLatch.await();
if(x ==0&& y ==0){//x=y=0 只能是x = b;y = a;这两个先执行
System.out.println("执行次数"+i+"发现x=y=0");
break;}}}}