Ява летучих и строительных объектов
Мне нужен совет модели памяти.
Как мы знаем 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
энергонезависимой такой гарантии больше не будет.
Правильно ли мое мнение? Можете ли вы расширить?