如果在并发哈希图上存在操作,如何执行安全获取? (类似于putIfAbsent)

不好的例子,不是很安全的线程(然后检查情况):

ConcurrentMap<String, SomeObject> concMap = new ...

//... many putIfAbsent and remove operations

public boolean setOption(String id, Object option){
   SomeObject obj = concMap.get(id);

   if (obj != null){
      //what if this key has been removed from the map?
      obj.setOption(option);
      return true;
   }

   // in the meantime a putIfAbsent may have been called on the map and then this
   //setOption call is no longer correct

   return false;
}

另一个不好的例子是:
   public boolean setOption(String id, Object option){
       if (concMap.contains(id)){
           concMap.get(id).setOption(option);
           return true;
       }
       return false;
    }

这里理想的是不要通过同步来限制添加,删除和获取操作的瓶颈。

谢谢

最佳答案

您似乎想做的是将一个键锁定在多个操作上。只有每个操作都是原子的。这不是锁定键的简单方法,而只是锁定地图。

但是,在“如果我删除密钥该怎么办”的情况下,您所能做的就是将删除操作延迟到调用setOption之后。结果应该是相同的。

您似乎正在尝试解决可能不需要解决的问题。您尚未说明为什么在删除键之后或等待删除键时调用setOption不好。

07-24 20:12