【发布时间】:2022-01-18 01:03:53
【问题描述】:
我使用ConcurrentHashMap<String, String> 作为缓存,执行读取操作以验证元素是否已在缓存中,并执行写入操作以将元素添加到缓存中。
所以,我的问题是:始终读取最新的 ConcorrentHashMap 值的最佳做法是什么?
我要保证数据的一致性,不要出现这样的情况:
- 使用
map.get("key")方法,第一个线程验证映射中尚不存在此键,然后执行map.put("value") - 第二个线程在第一个线程将元素放入地图之前读取数据,导致数据不一致。
代码示例:
Optional<String> cacheValue = Optional.ofNullable(cachedMap.get("key"));
if (cacheValue.isPresent()) {
// Perform actions
} else {
cachedMap.putIfAbsent("key", "value");
// Perform actions
}
如何确保我的ConcurrentHashMap 已同步并且不会检索到不一致的数据?
我应该在同步块中执行这些映射操作吗?
【问题讨论】:
-
Javadoc 说什么不清楚?
-
如果您阅读 Javadoc,您会看到单个插入和删除是原子发生的,但对读者的唯一保证是他们不会看到部分完成的更改,因此不会有
ConcurrentModificationException扔了。 -
是的@SolomonSlow!就是你说的! "在第一个线程调用 put("key", data) 之前,第二个线程调用 map.get("key")"
-
对不起,我删除了那条评论,我想我误读了你的问题。
-
你知道
computeIfAbsent方法吗?
标签: java multithreading concurrency concurrenthashmap