Короче говоря, нет необходимости в том, чтобы карта была поточно-ориентированной, если считывания не являются разрушающими, а ссылка на карту безопасно публикуется для клиента.
В примере есть два важных происходит до отношений, установленных здесь.Окончательная публикация поля (тогда и только тогда, когда заполнение выполняется внутри конструктора и ссылка не просачивается за пределы конструктора) и вызовы для запуска потоков.
Все, что изменяет карту после этих вызововВ отношении чтения клиента с карты небезопасно публикуется.
У нас есть, например, CopyOnWriteMap , который имеет не поточно-ориентированную карту, которая копируется при каждой записи.Это происходит настолько быстро, насколько это возможно в ситуациях, когда операций чтения намного больше, чем операций записи (хорошим примером является кэширование данных конфигурации).
Тем не менее, если на самом деле цель состоит в том, чтобы не менять карту, установка неизменяемой версии карты в поле - это всегда лучший путь, поскольку он гарантирует, что клиент увидит правильную вещь.
Наконец, есть некоторые реализации Map
с деструктивным чтением, такие как LinkedHashMap
с упорядочением доступа или WeakHashMap
, где записи могут исчезать.Эти типы карт должны быть доступны последовательно.