我试图在注入控制器的singleton 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();
}
}
有没有更好的方法来访问线程安全的hashmap?我怎样才能使其适应集群环境?这是my other question.
之后的结果答案 0 :(得分:0)
我的目的不是要回答问题esp。因为我没有集中情况的专业知识;但是,我想指出我认为值得注意的事情。
@JB Nizet在其中一条评论中提到代码是线程安全和正确。我想基于Java API Reference添加 not consistent :
检索操作(包括get)一般不会阻塞,所以可能 与更新操作重叠(包括放置和删除)
这意味着当某些更新当前正在运行时,可能有客户端获取此信息。而且,这是有道理的,因为你在代码中提到'循环'。所以,如果你的情况下 NOT 很重要,那么一切都应该没问题。
但是,如果你需要更加严格,我认为使用ReentrantReadWriteLock
的实例可能是一个不错的选择。锁定使您的代码能够阻止所有读取请求,直到有可用信息的一致快照。您可能正在使用getCount
方法上的锁来严格阻止,直到add
方法释放所有等待代码中使用的映射的一致快照的锁。
我还猜测,将此迁移到群集解决方案时,同样的问题是有效的。如果在不同的集群节点上需要一致性,则应该注意它。