我有一个静电HashMap
它在应用程序启动时填充,并每天刷新。
如何确保刷新期间没有其他线程可以访问地图?
@ThreadSafe
public class MyService {
private static final Map<String, Object> map = new HashMap<>();
private MyDao dao;
public void refresh(List<Object> objects) {
map.clear();
map.addAll(dao.findAll()); //maybe long running routine
}
public Object get(String key) {
map.get(key); //ensure this waits during a refresh??
}
}
我是否应该介绍一个简单的boolean lock
期间设置和清除refresh()
?或者还有更好的选择吗?或者是synchronized
机制还有路要走吗?
您可以使用易失性地图并在填充后重新分配它:
public class MyService {
private static volatile Map<String, Object> map = new HashMap<>();
private MyDao dao;
public void refresh(List<Object> objects) {
Map<String, Object> newMap = new HashMap<>();
newMap.addAll(dao.findAll()); //maybe long running routine
map = newMap;
}
public Object get(String key) {
map.get(key); //ensure this waits during a refresh??
}
}
它是非阻塞的,分配来自newMap
to map
是原子的并确保可见性:任何后续调用get
将基于刷新的地图。
从性能角度来看,这应该可以很好地工作,因为易失性读取几乎与正常读取一样快。易失性写入稍微慢一点,但考虑到刷新频率,这应该不是问题。如果性能很重要,您应该运行适当的测试。
注意:您必须确保没有外部代码可以访问map
引用,否则该代码可能会访问过时的数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)