话不多说,先上代码:

    1. private static int x = 0,y = 0,a = 0, b = 0;
    2. public static void main(String[] args) throws InterruptedException {
    3. int i = 0;
    4. for (;;){
    5. i++;
    6. x = 0;y = 0;
    7. a = 0; b = 0;
    8. Thread one = new Thread(() -> {
    9. a = 1;
    10. x = b;
    11. });
    12. Thread two = new Thread(() -> {
    13. b = 1;
    14. y = a;
    15. });
    16. one.start();two.start();
    17. one.join();two.join();
    18. String result = "第" + i + "次 (" + x + "," + y + ")";
    19. System.out.println(result);
    20. if(x == 0 && y == 0){
    21. break;
    22. }
    23. }
    24. }

    如果不考虑指令重排序,x和y的结果有以下几种可能:
    1.严格按照线程1和线程2顺序执行,x = 0,y = 1或者x = 1,y = 0;
    2.当线程one执行到a = 1时,线程two就去执行了b = 1,然后再接着往下执行,此时x = 1 ,y = 1
    永远不会出现x = 0,y = 0的情况。
    但执行上面的程序的时候,发现有可能会break掉,说明发生了指令重排序的情况。

    volatile底层是如何实现指令重排序的呢?
    是因为加了内存屏障。