使用ConcurentHashMap和AtomicInteger作为spring服务类中的实例变量

时间:2012-06-20 19:22:09

标签: java multithreading spring concurrency

我试图在注入控制器的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.

之后的结果

1 个答案:

答案 0 :(得分:0)

我的目的不是要回答问题esp。因为我没有集中情况的专业知识;但是,我想指出我认为值得注意的事情。

@JB Nizet在其中一条评论中提到代码是线程安全正确。我想基于Java API Reference添加 not consistent

  

检索操作(包括get)一般不会阻塞,所以可能   与更新操作重叠(包括放置和删除)

这意味着当某些更新当前正在运行时,可能有客户端获取此信息。而且,这是有道理的,因为你在代码中提到'循环'。所以,如果你的情况下 NOT 很重要,那么一切都应该没问题。

但是,如果你需要更加严格,我认为使用ReentrantReadWriteLock的实例可能是一个不错的选择。锁定使您的代码能够阻止所有读取请求,直到有可用信息的一致快照。您可能正在使用getCount方法上的锁来严格阻止,直到add方法释放所有等待代码中使用的映射的一致快照的锁。

我还猜测,将此迁移到群集解决方案时,同样的问题是有效的。如果在不同的集群节点上需要一致性,则应该注意它。