Ява летучих и строительных объектов

Мне нужен совет модели памяти.

Как мы знаем volatile write и последующее volatile read есть отношения до того. Также мы знаем, что конструкторы не синхронизированы и между возвратами конструкторов и использованием инициализации полей нет никаких исключений (кроме полей final). Теперь рассмотрим следующий код:

public class MyClass{
    public volatile String str1;
    public volatile String str2;

    public MyClass(String str1, String str2){
        this.str1 = str1;
        this.str2 = str2;
    }

    public void use(){
        System.out.println(str1 + str2);
    }
}

использование:

public volatile MyClass mc = null;

Thread(() -> {
    mc = new MyClass("str1", "str2"));
}).start();

Thread(() -> {
    If(mc != null)
       mc.use;       //Is it guaranteed that str1str2 will be printed if we get here?
}).start();

Гарантируется ли, что если нить обнаружит mc != null затем str1str2 всегда будет напечатан?

Я думаю, что это гарантировано JMM, потому что здесь, в mc = new MyClass("str1", "str2")); писать в MC и писать в str1 а также str2 в отношениях до и после. Это потому что пишу str1 / str2 выполняются в соответствии с семантикой между потоками, поэтому они находятся в программном порядке. Итак, мы пишем mc чтение mc поэтому "str1str2" всегда будет напечатан.

Также, если мы сделаем поля str1 / str2 энергонезависимой такой гарантии больше не будет.

Правильно ли мое мнение? Можете ли вы расширить?

0 ответов

Другие вопросы по тегам