Нет такой гарантии, что ThreadB увидит обновления, сделанные в currencyList потоком A.
private final Cache cache;
гарантирует, что кеш безопасно публикуется.Это означает, что читатели / другие потоки будут рассматривать кэш как правильно построенный объект (в вашем случае currencyMap и currencyList не будут иметь значение null и будут построены правильно).
Если ThreadA изменяет currencyList, нет никакой гарантии, что ThreadB увидит новые значения.Для этого вам нужно синхронизировать доступ к currencyList.
CurrencyMap - это ConncurrentHashMap, который является потокобезопасным классом (методы, которые изменяют состояние карты, внутренне синхронизированы).Если вы никогда не измените ссылку на currencyMap (вы никогда не будете назначать какую-либо другую карту этой ссылке), тогда вам не нужно синхронизировать доступ к этой карте (потому что кеш безопасно опубликован), но лучше было бы объявитьcurrencyMap как окончательный (это гарантирует, что ссылка не будет переназначена).