首页 > 解决方案 > ConcurrentHashMap 保证

问题描述

我在某些服务类中有并发哈希图:

class MyClass implements Flushable {
   private volatile ConcurrentHashMap<Integer, Object> hashMap = ...

   public void add(int id, Object value) {
      hashMap.put(id, value);
   }

   @Override
   public void flush() throws IOException {
      hashMap.foreach((k, v) -> ...)
      hashMap.clear();
   }

}

我是否需要做一些额外的锁定以确保:1. flush 将处理所有映射条目(如果在 foreach 和 clear 之间调用 add 怎么办?) 2. clear 不会删除在 foreach 之后插入/更新的条目

从 javadoc 可以保证更新发生在读取之前。据我所知,clear会阻止put调用,但是要达到我想要的,我需要一些额外的锁。

标签: javaconcurrencysynchronizationlockingconcurrenthashmap

解决方案


在您的情况下,您需要在此处进行任何额外的锁定,两者都是操作应该被锁定,清除方法也可以在段级别锁定..


推荐阅读