Мне интересно, какие гарантии публикации существуют для не конечного поля, инициализированного нулевым, если оно есть.
Рассмотрим следующий фрагмент:
public class MyClass {
private final CopyOnWriteArrayList<Inner> list = new CopyOnWriteArrayList<>();
//called by thread 1
public void init() {
// initialise Inner instance
list.add(new Inner());
}
//called by thread 2
public void doSomething() {
for (Inner i : list) {
// access non-final field
Object ref = i.ref;
// do something
// ...
// ...
// potentially set i.ref
}
}
private static class Inner {
// initialised by thread 1
Object ref = null;
}
}
Предполагая, что doSomething()
всегдавызывается потоком 2, это безопасно?Какие гарантии дает то, что поток 2 увидит при первом обращении к нему?Есть ли вероятность того, что поток 2 увидит что-то ненулевое?
Где в JMM описана семантика этой ситуации?