Java线程中的内存顺序和可见性

时间:2018-10-31 08:37:51

标签: java java-memory-model

class S {
    public int x = 100; 
}

class T {
    public void do(S s){
       new Thread( () -> { 
            System.out.println(s.x);
        };).start();
    }
}


class M {
    public static void main(String[] args){
       T t = new T();
       S s = new S();
       s.x = 101;
       t.do(s);
    }
}

你好

是否保证T::do总是看到s.x == 101?为什么是,为什么不是?

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

启动线程时,这会引入内存屏障,在启动线程之前发生的任何事情都将可见。注意:从计算机角度来讲,启动线程需要很长时间。

BTW System.out.println是一种同步方法,它添加了完整的读/写内存屏障,尽管在这种情况下,这无关紧要/