Первый случай
это не потокобезопасно, ConcurrentHashMap обеспечивает безопасность потоков только при работе с API HashMap, что означает добавление и удаление объектов из HashMap. он не обеспечивает безопасность потока при изменении ссылки на HashMap, если вы думаете об этом, изменение ссылки на HashMap не имеет никакого отношения к реализации HashMap.
Второй и третий случаи
Эти случаи являются поточно-ориентированными, в этих случаях вы изменили способ назначения и получения ссылки HashMap, чтобы обеспечить безопасность потоков.
в отношении того, использовать ли volatile или AtomicReference выможете прочитать this
, чтобы дать вам tl; dr: AtomicReference имеет больше функциональных возможностей, но использует дополнительную память для обеспечения этой функциональности, мое личное мнение таково, что если вы не заинтересованы в памяти, переходитевперед и используйте AtomicReference, он более читабелен, и вы не знаете, когда вам понадобится дополнительная функциональность.