【推荐阅读】微服务还能火多久?>>> volatile关键字-LMLPHP

防止指令重排只能防止volatile关键字变量之前的操作的不重排。

而且不要加在引用变量上,加在x,y上因为a,b已经发生指令重排了,所以x,y读取的是指令重排后的a,b是不起作用的。

volatile关键字-LMLPHP

volatile关键字-LMLPHP

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;
            }
        }
    }
}
04-15 05:18