Порядок памяти и видимость в потоке Java - PullRequest
0 голосов
/ 31 октября 2018
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 голосов
/ 31 октября 2018

Когда вы запускаете поток, это создает барьер памяти, где все, что произошло до того, как вы начали поток, будет видно. Примечание: запуск потока занимает очень много времени в компьютерном плане.

BTW System.out.println - это синхронизированный метод, который добавляет полные барьеры чтения / записи памяти, хотя в этом случае это не имеет значения /

...