2

我正在尝试在注入控制器的单例弹簧服务中实现 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 线程安全?我怎样才能使它适应在集群环境中工作?这是对我的另一个问题的跟进。

4

1 回答 1

0

我的目标不是要回答这个问题,尤其是。因为我没有集群情况下的专业知识;但是,我想指出我认为值得注意的地方。

@JB Nizet 在其中一条评论中提到代码是线程安全正确的。我想根据Java API Reference添加但不一致

检索操作(包括 get)一般不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠

这意味着在某些更新当前正在运行时,可能会有客户端获取此信息。而且,这是有道理的,因为您在代码中提到了“循环”。所以,如果这对你来说并不重要,那么一切都应该没问题。

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

我还猜测,当您将其迁移到集群解决方案时,同样的担忧是有效的;如果需要跨不同集群节点的一致性,那么应该注意它。

于 2012-06-20T20:16:44.057 回答