gpt4 book ai didi

java - 如何锁定 ConcurrentHashMap 中的键

转载 作者:行者123 更新时间:2023-11-29 08:27:07 24 4
gpt4 key购买 nike

我正在将一个由线程创建的对象缓存到 map 中。对象的创建是昂贵的,所以我不希望运行多个线程来创建对象,因为 put() 尚未返回。一旦线程尝试为该键创建对象,其他线程不应尝试创建该对象,即使 put 尚未完成。使用 computeIfAbsent() 是否可以获取该特定 key 的“锁定”?如果没有,是否有其他方法可以实现此目的?

最佳答案

> 使用 computeIfAbsent() 是否可以获取该特定 key 上的“锁”?

是的;每the Javadoc for ConcurrentHashMap.computeIfAbsent(...) :

The entire method invocation is performed atomically, so the function is applied at most once per key.

这确实是该方法的重点。

但是,需要明确的是,这把锁并不完全特定于那把 key ;相反,ConcurrentHashMap通常通过将 map 拆分为多个段并为每个段锁定一个锁来工作。这允许大量并发,并且通常是最有效的方法;但您应该知道,这意味着某些线程可能会阻塞您的对象创建,即使它们实际上并未触及同一个键。

如果这对您来说是个问题,那么另一种方法是使用类似 ConcurrentHashMap<K, AtomicReference<V>> 的方法。将添加 map 条目与填充 map 条目分离开来。 ( AtomicReference<V> 没有 computeIfAbsent 方法,但此时您可以使用普通的双重检查锁定结合 get()synchronized 。)

关于java - 如何锁定 ConcurrentHashMap 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51716527/

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