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);
}
}
我正在 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);
}
}