Простая синхронизация доступа к ссылке на карту не решает проблему.После создания карты вам необходимо синхронизировать операции, которые обращаются к содержимому карты и, возможно, изменяют его.Исключением было бы, если бы вы знали, что карта заполняется один раз во время инициализации, и после этого выполняются только операции чтения.В этом случае у вас может быть все в порядке без явной синхронизации, потому что ваш поток управления позаботится об этом (зная, что логика вашей программы разрешает чтение только после инициализации карты).
В противном случае, я бы предложил вам использовать один изреализации ConcurrentMap
, например ConcurrentHashMap
, поскольку они относительно дешевы, если нет конфликта блокировок, и все еще обеспечивают необходимую безопасность потока, если вы выполняете чтение и запись в течение времени жизни карты.
Что касаетсяинициализация, так как это статическое поле (только один экземпляр) и стоимость создания пустой карты за один раз невелика, я бы посоветовал вам просто объявить вашу карту следующим образом:
private static final Map<String,String> map = new ConcurrentHashMap<String,String>();
Этотак как вам не нужен условный код в других методах, нет проблем с видимостью ссылок, и код становится проще.