Spring и Java видимость
В последнее время наша система испытывает все виды Spring, связанные с "вуду". Обычно это выглядит примерно так:
Различные одноэлементные bean-компоненты имеют свойства (ctor) autowired, на основе которых они создают некоторые внутренние структуры данных. В какой-то момент мы начали видеть явления, когда внутреннее состояние не было инициализировано, несмотря на то, что бин был сконструирован и передан приложению. и это произошло недетерминированным образом, конечно.
Типичный боб будет выглядеть так:
class MyBean{
Map<String, Objecet> state;
@Autowired
public MyBean(List<Stuff> stuff){
state = new HashMap<>();
pupolateStateBasedOnStuff();
}
getSomeState(String key){
// I would get an NPE (state = null) or an instantiated
// state that is seemingly empty!
state.get(key);
}
}
В какой-то момент я наткнулся на эту статью, на этот ТАК ответ и на это написание Брайана Гетца. Я страдаю от этой самой проблемы. После прочтения у меня есть два вопроса:
Коза пишет:
Таким образом, вы можете иметь окончательный указатель на массив и не беспокоиться о том, что другие потоки видят правильные значения для ссылки на массив, но неправильные значения для содержимого массива
Вопрос 1
Является ли это утверждение транзитивным? Это означает, что это относится не только к объектам, на которые ссылается конечная переменная, но также к объектам, на которые они ссылаются и т. Д. (Охватывающим все дерево достижимых объектов)?
Кроме того, что если у меня есть следующий сценарий:
class Bar{
volatile Foo foo;
public Bar() { }
// Bar is actually initialized outside of its ctor.
public init(Object state) {
foo = new Foo(state);
}
getSomeStuff(){
// will 'stuff' be fully visible because it
// was created by assignment to a final variable?
return foo.stuff;
}
}
Фу выглядит так:
class Foo{
final Object stuff ;
Foo(Object state){
this.stuff = computeStuff(state);
}
}
вопрос 2
Этот "трюк" обеспечивает видимость "материала"?
Другими словами - у меня есть класс, который инициализируется вне его ctor (не может быть конечного члена). Но я все еще хочу обеспечить видимость. Поэтому я обернул состояние в объект, который присваивает его конечной переменной внутри его ctor.