如果在并发哈希图上存在操作,如何执行安全获取? (类似于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不好。