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.

0 ответов

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