Java 中整个地图的线程安全交换

Thread safe swap of entire map in Java

我正在 spring 网络服务中实现线程安全 map

地图是这样的

我选择 ConcurrentHashMap 作为线程安全映射,但是没有简单地将其内容与更新的内容交换的功能,例如 c++ 中的 std::map::swap()
(我认为多线程环境需要对整个内容进行原子更新,也许我错了)

是否有 swap 的替代地图?

如有任何建议或回复,我们将不胜感激。谢谢。

如果不需要改变地图,只需自动替换它,您可以将地图包装在AtomicReference 并一次原子地替换引用。不同的线程不会保留对地图实例本身的引用,而是周围的 AtomicReference 实例。

class Example {
    private final AtomicReference<Map<String, String>> mapRef = new AtomicReference<>(someInitialState);

    private void consumerThread() {
        // Get the current version of the map and look up a value from it.
        String value = mapRef.get().get("Hello");
        // Do something with value.
    }

    private void producerThread() {
        // Time to replace the whole map for all threads
        Map<String, String> newMap = calculateNewMap();
        mapRef.set(newMap);
    }
}