Окончательные ссылки на объекты - гарантируется ли видимость между всеми потоками? - PullRequest
0 голосов
/ 06 февраля 2019

Я читал эту статью:

https://www.javamex.com/tutorials/synchronization_final.shtml

Там указано:

Поля любого объекта, доступ к которому осуществляется через окончательную ссылку, также гарантированнобыть по крайней мере таким же современным, как и при выходе из конструктора.Это означает, что: Значения конечных полей, включая объекты внутри коллекций, на которые ссылается окончательная ссылка, можно безопасно читать без синхронизации.

Скажем, у меня есть класс, как показано ниже:

public class Cache {


private Map<String, Currency> currencyMap = new ConcurrentHashMap<String, Currency>();
private List<Currency> currencyList = new ArrayList<Currency>();
}

Если я объявлю в своем главном классе приложения:

private final Cache cache;

Будет ли это означать, если поток A обновит currencyMap и currencyList, то это будет гарантировать, что поток B увидит последние записи в currencyMap и currencyList?

1 Ответ

0 голосов
/ 01 апреля 2019

Нет такой гарантии, что ThreadB увидит обновления, сделанные в currencyList потоком A.

private final Cache cache;

гарантирует, что кеш безопасно публикуется.Это означает, что читатели / другие потоки будут рассматривать кэш как правильно построенный объект (в вашем случае currencyMap и currencyList не будут иметь значение null и будут построены правильно).

Если ThreadA изменяет currencyList, нет никакой гарантии, что ThreadB увидит новые значения.Для этого вам нужно синхронизировать доступ к currencyList.

CurrencyMap - это ConncurrentHashMap, который является потокобезопасным классом (методы, которые изменяют состояние карты, внутренне синхронизированы).Если вы никогда не измените ссылку на currencyMap (вы никогда не будете назначать какую-либо другую карту этой ссылке), тогда вам не нужно синхронизировать доступ к этой карте (потому что кеш безопасно опубликован), но лучше было бы объявитьcurrencyMap как окончательный (это гарантирует, что ссылка не будет переназначена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...