【发布时间】:2018-11-03 15:40:29
【问题描述】:
我有一个 ConcurrentHashMap:
ConcurrentHashMap<ID,Object> map;
在我的应用中,这张图是高读低写的
通过以下方式阅读作品:
public Response getObject() {
Response response = createResponse();
Object obj = map.get(ID);
if (obj != null) {
if (obj.getAttribute1() == some_value) {
response.setAttr1(obj.getAttr1());
response.setAttr2(obj.getAttr2());
}
}
return response;
}
更新的工作方式如下:
public void updateObject(Object obj, int action) {
if (action == ADD) {
map.put(obj.getID(), obj);
} else if (action == UPDATE) {
object oldObj = map.get(obj.getID());
if (oldObj != null) {
map.put(obj.getID(), obj);
}
} else if (action == REMOVE) {
object oldObj = map.get(obj.getID());
if (oldObj != null) {
map.remove(obj.getID());
}
}
}
现在我的问题是,ConcurrentHashMap 是否足以让上述情况在多线程环境中以线程安全的方式工作,还是我必须通过读写锁从外部锁定对象或使用对象的克隆?
假设在从 map 读取 obj 的情况下,ConcurrentHashMap 将确保它会返回最新写入的对象,但是当写入线程在读取之后删除/更新该对象时呢?读取对象(已被删除/更新from map) 用于准备响应对象,其属性用于做出某些决定。
更新地图的更好方法应该是什么?
【问题讨论】:
标签: java multithreading concurrenthashmap