gpt4 book ai didi

java - 同时读写 ConcurrentHashMap 的值对象

转载 作者:行者123 更新时间:2023-11-29 09:26:55 25 4
gpt4 key购买 nike

我有一个 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 是否足以让上述情况在多线程环境中以线程安全的方式工作,或者我必须通过 ReadWrite 锁在外部锁定对象或使用对象的克隆?

假设在从 map 中读取 obj 的情况下,ConcurrentHashMap 将确保它将返回最新写入的对象,但是当这个对象在读取之后被写入线程删除/更新时呢?读取对象(已经删除/更新) from map) 用于准备响应对象,其属性用于做出某些决策。

更新 map 的更好方法应该是什么?

最佳答案

为了使您的代码相对于 ConcurrentHashMap 是线程安全的,您应该使用相应的 compute 方法(以原子方式执行):

public Response getObject() {
Response response = createResponse();

map.computeIfPresent(ID, (k, v) -> {
if (v == some_value) {
response.setAttr1(v.getAttr1());
response.setAttr2(v.getAttr2());
}

return v;
}

return response;
}

和:

public void updateObject(Object obj, int action) {
if (action == ADD) {
map.put(obj.getID(), obj);
} else if (action == UPDATE) {
map.computeIfPresent(obj.getID(), (k, v) -> obj);
} else if (action == REMOVE) {
map.remove(obj.getID());
}
}

关于java - 同时读写 ConcurrentHashMap 的值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53132855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com