我有一个静电HashMap
在服务器启动时初始化。客户端在登录时从该地图初始化其数据。
现在我需要刷新这张地图,但是客户端可以同时登录并从这张地图中获取数据。
当他们阅读时,我可以更改如下所示的地图参考吗?
我不能使用synchronized
因为它们可以同时读入,并且只有一个线程在写。
public void refresh() {
Map<String, Object> newMap = prepareData();
map = newMap;
}
让我们假设“刷新”意味着您想要用从(比如说)文件加载的新集替换哈希图中的所有条目。
如果新映射中的键集是原始映射中键的超集,并且如果您的应用程序不关心客户端是否可以同时设置旧映射的一部分和新映射的一部分,那么您可以使用ConcurrentHashMap
代替HashMap
,并将条目替换为一系列put
calls.
但是,如果密钥(或可能)不同,或者如果从客户端的角度来看更新需要是原子的,那么ConcurrentHashMap
是行不通的。相反,您需要声明map
as a volatile
并实施你的refresh()
根据你的问题的方法。
正如您所指出的,使用synchronized
(或单写入多读取锁)很容易导致并发瓶颈。
注意:使用volatile
可能会比使用ConcurrentHashMap
即使后者是可行的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)