на Яве, как заменить неизменный объект

как

позволяет говорят, что у меня есть этот класс

@ImmutableWannabe
public class ConfigurationHolder {
  @ImmutableButкакToMakeSureNoTwoThreadsOverrideOneEachOtherWhenReplacingReference
  private Map mySysConfig  = ImmutableMap.builder<>getSomeConfigurations....build();
  ConfigurationHolder(copy constructor) {
     mySysConfig = ImmutableMap.builder().of(inputSysConfig);
  }
}

Now lets say one of the systems configuration has updated and i need to update this map of какever I need to do it in a thread safe way. which means if two threads try to update the same configuration of same system data should be consistent and they should not override one each other.

как did immutability help me here? As far as i can see i still need to do locking if yes как to do it properly?

таким образом, мой общий вопрос: разве это не случай, что какой-либо immutableObject, который может измениться за системное время, заставит нас должны захватывать код, который должен будет изменить его ImmutableObjectHolder? Я не получаю его...

кто-то может, пожалуйста, дать надлежащий пример ImmutableMap + Держатель для той Карты + надлежащий код "клиента", который знает, чтобы обновить этот ImmutableMapHolder с обновлениями внутренней Карты?

спасибо

2
nl ja de
да уверенный, но когда я указываю его на другую карту don' t я должен удостовериться, что две нити, которые знали о двух различных картах, потому что они читают их в двух различных моментах времени, теперь изменяют указатели на два различных, и это вызовет ошибки? если that' s случай я все еще должен волноваться о замках также с immutableObjects, который является правильным?
добавлено автор Jas, источник
да, таким образом, в конце ряда всегда будет изменчивый объект считать все эти неизменные правом? (В случае, если я должен заменить неизменные, какое-либо спасение здесь, чтобы избежать какого-либо вида таких изменчивых держателей?).
добавлено автор Jas, источник
Если you' ре, обновляющее ImmutableMap , вы действительно действительно shouldn' t отметить ConfigurationHolder как сам неизменный.
добавлено автор Louis Wasserman, источник
Вы не можете обновить неизменную карту, но можно указать держателю на различного. Таким образом, никакая нить не будет видеть непоследовательную карту (они будут только или старый, или новый, но не странное соединение).
добавлено автор Thilo, источник
если у вас есть две нити, которые хотят обновить держателя, то да, они должны захватить (оптимистично или пессимистически). Вы, вероятно, хотите AtomicReference для этого. Но нити это только прочитало don' t нужен любой захват.
добавлено автор Thilo, источник

1 ответы

Принятие вашей карты является некоторой переменной экземпляра, самый простой путь это, чтобы сделать его изменчивый . Альтернативно, сделайте получателя и сеттера для него и сделайте их синхронизированный . т.е., используйте стандартные методы. И обратите внимание, что это не поможет, если клиент попытается быть умным и припрятать стоимость про запас в локальной переменной. (Я укусил меня с этой ошибкой пару раз.)

Я предполагаю как альтернатива, вы могли установка некоторое событие/слушатель MyImmutableChanged.

И, вы правильны, неизменность не решает каждую проблему многопоточности.

1
добавлено
Посмотрите [это, ТАК отправьте] (stackoverflow.com/questions/281132/…). Короткий ответ - это любой работы. Я склонен использовать изменчивую причину, я никогда не думаю о AtomicReference.:-)
добавлено автор user949300, источник
большое спасибо можно ли, пожалуйста, просто уточнить, когда я использовал бы изменчивый в таких случаях и когда AtomicReference в таких случаях?
добавлено автор Jas, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async