Здесь сделка. У меня есть хэш-карта, содержащая данные, которые я называю "программными кодами", она живет в объекте, например:
Class Metadata
{
private HashMap validProgramCodes;
public HashMap getValidProgramCodes() { return validProgramCodes; }
public void setValidProgramCodes(HashMap h) { validProgramCodes = h; }
}
У меня много и много потоков читателей, каждый из которых будет вызывать getValidProgramCodes() один раз, а затем использовать этот хэш файл как ресурс только для чтения.
Пока все хорошо. Здесь, где мы получаем интерес.
Я хочу поставить таймер, который так часто генерирует новый список действительных программных кодов (неважно, как), и вызывает setValidProgramCodes.
Моя теория, в которой мне нужна помощь для проверки, заключается в том, что я могу продолжать использовать код как есть, не вставляя явную синхронизацию. Это происходит так: Во время обновления validProgramCodes значение validProgramCodes всегда хорошо - это указатель на новый или старый хэш файл. Это предположение, на котором все зависит. Читатель, у которого есть старый хэш, в порядке; он может продолжать использовать старое значение, поскольку он не будет собирать мусор, пока он не выпустит его. Каждый читатель преходящ; он скоро умрет и будет заменен новым, который получит новое значение.
Это ли вода? Моя основная цель - избежать дорогостоящей синхронизации и блокировки в подавляющем большинстве случаев, когда обновление не происходит. Мы обновляемся раз в час или около того, и читатели постоянно мерцают и выходят.