我正在尝试在注入控制器的单例 Spring 服务中实现 ConcurentHashMap 的线程安全使用:
@Service
public MyService{
final ConcurrentMap<String, AtomicInteger> myMap = new ConcurrentHashMap<String, AtomicInteger>(10) {
{/* initialize the ten key/values */
}
};
public int add(String key) {
return myMap.get(key).incrementAndGet();
}
// accessed via ajax loop (and controller), if value changes update display
public int getCount(String key) {
return myMap.get(key).get();
}
}
有没有更好的方法来使对哈希图的访问成为线程安全的?我如何才能使其适应集群环境中的工作?这是后续我的另一个问题。
我的目的并不是要回答这个问题,尤其是。因为我没有集群情况的专业知识;不过,我想指出我认为值得注意的地方。
@JB Nizet 在其中一条评论中提到代码是线程安全 and correct。我想补充一下,但是不一致基于Java API 参考:
检索操作(包括 get)一般不会阻塞,因此可能
与更新操作重叠(包括放置和删除)
这意味着在进行某些更新时可能会有客户端获取此信息现在跑步。而且,这是有道理的,因为您在代码中提到了“循环”。所以,如果这是NOT对你来说很重要,那么一切都应该没问题。
但是,如果你需要使它更严格,我想也许使用一个实例ReentrantReadWriteLock将是一个不错的选择。该锁使您的代码能够阻止所有读取请求,直到出现持续的可用信息的快照。您可能会使用getCount
方法严格阻塞直到add
方法释放等待代码中使用的映射的一致快照的所有锁。
我还猜测,当您将其迁移到集群解决方案时,同样的担忧也是有效的;如果一致性需要跨不同的集群节点,那么应该照顾到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)