Предисловие: я знаю, что в большинстве случаев использование изменчивого поля не приведет к каким-либо ощутимым потерям производительности, но этот вопрос носит более теоретический характер и нацелен на дизайн с чрезвычайно высокой поддержкой коррэнсов.
У меня есть поле, List<Something>
, которое заполняется после построения. Чтобы сохранить производительность, я хотел бы преобразовать Список в карту только для чтения. Для этого в любой момент требуется как минимум изменчивое поле карты, поэтому внесите изменения, видимые для всех потоков.
Я думал сделать следующее:
Map map;
public void get(Object key){
if(map==null){
Map temp = new Map();
for(Object value : super.getList()){
temp.put(value.getKey(),value);
}
map = temp;
}
return map.get(key);
}
Это может привести к тому, что несколько потоков сгенерируют карту, даже если они войдут в блок get сериализованным способом. Это не будет большой проблемой, если потоки работают на разных идентичных экземплярах карты. Что меня беспокоит больше всего:
Возможно ли, что один поток назначит новую временную карту полю карты, а затем второй поток увидит это map!=null
и, следовательно, получит доступ к полю карты, не создавая новое, но, к моему удивлению, обнаружит, что карта пусто, потому что операции put, которые еще не помещены в какую-либо область общей памяти?
Ответы на комментарии:
- Потоки изменяют временную карту только после того, как она доступна только для чтения.
- Я должен преобразовать Список в Карту из-за какой-то особой настройки JAXB, которая не дает возможности иметь Карту для начала.