指令重排happen-before 数据同步volitale

循环20次,初始值如下

a = 0;
flag = false;

让t线程先执行,t2线程后执行,
期盼的结果应该是始终没有输出
但结果却是输出任意个0

这是因为数据没有及时同步 导致a仍然为0 flag仍然为false或者flag改变了但是a也是没有及时作出同步操作


public class TextTimer {

    private static int a = 0;
    private static boolean flag = false;

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            a = 0;
            flag = false;

            Thread t = new Thread(() -> {
                a = 1;
                flag = true;
            });
            Thread t2 = new Thread(() -> {
                if (flag) {
                    a *= 1;
                }
                if (a == 0) {
                    System.out.println(a);
                }
            });
            t.start();
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t2.start();
            try {
                t2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

将a和flag都加上volitale,让他们能够及时同步

结果:不再出现输出0的情况

你可能感兴趣的:(javaSE)