java内存模型

可见性问题:


public class VisibilityDemo {

    private boolean flag = true;

    public static void main(String[] args) throws InterruptedException {
        VisibilityDemo demo1 = new VisibilityDemo();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                while (demo1.flag){
                    I++;
                }

                System.out.println("i="+i);

            }
        });

        thread1.start();

        TimeUnit.SECONDS.sleep(2);
        demo1.flag = false;
        System.out.println("被设置为false");
    }
}

问题:指令重排


屏幕快照 2019-09-10 下午11.53.18.png

屏幕快照 2019-09-10 下午11.53.54.png

jvm文档:
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

屏幕快照 2019-09-11 下午11.28.38.png

cpu缓存可能导致的不一致可以通过volatile解决

屏幕快照 2019-09-14 上午12.21.30.png

屏幕快照 2019-09-14 上午12.28.20.png

屏幕快照 2019-09-14 上午12.40.35.png

你可能感兴趣的:(java内存模型)