Ситуация такова:
- У меня есть объект с множеством сеттеров и геттеров.
- Экземпляр этого объекта создается в одном конкретном потоке, где установлены все значения. Сначала я создаю "пустой" объект, используя новый оператор, и только тогда я вызываю некоторые методы сеттеров на основе некоторой сложной логики.
- Только тогда этот объект стал доступен для всех других потоков, которые используют только геттеры.
Вопрос: Должен ли я сделать все переменные этого класса неустойчивыми или нет?
Заботы:
- Создание нового экземпляра объекта и установка всех его значений разделяется по времени.
- Но все остальные потоки не знают об этом новый экземпляр до тех пор, пока не будут установлены все значения. Таким образом, другие потоки не должны имеют кэш не полностью инициализированного объекта. Не правда ли?
Примечание. Я знаю о шаблоне построителя, но я не могу применить его там по нескольким причинам: (
Редакция: Поскольку я чувствую, что два ответа от Mathias и axtavt не совпадают очень хорошо, я хотел бы добавить пример:
Скажем, у нас есть класс foo
:
class Foo {
public int x=0;
}
и два потока используют его, как описано выше:
// Thread 1 init the value:
Foo f = new Foo();
f.x = 5;
values.add(f); // Publication via thread-safe collection like Vector or Collections.synchronizedList(new ArrayList(...)) or ConcurrentHashMap?.
// Thread 2
if (values.size()>0){
System.out.println(values.get(0).x); // always 5 ?
}
Как я понял, Матиас, он может распечатать 0 на некоторых JVM в соответствии с JLS. Поскольку я понял axtavt, он всегда будет печатать 5.
Каково ваше мнение?
- С Уважением, Дмитрий