dt9*_*t94 5 java concurrenthashmap
我正在将一个由线程创建的对象缓存到地图中。对象的创建是昂贵的,所以我不希望多个线程运行来创建对象,因为 put() 没有返回。一旦一个线程尝试为该键创建一个对象,其他线程不应尝试创建该对象,即使 put 尚未完成。使用computeIfAbsent() 是否可以在该特定键上获得“锁定”?如果没有,是否有另一种方法可以实现这一目标?
> 使用computeIfAbsent() 能否获得该特定键的“锁定”?
是的; 根据Javadoc 对于ConcurrentHashMap.computeIfAbsent(...):
整个方法调用以原子方式执行,因此每个键最多应用一次该函数。
这就是该方法的全部意义所在。
然而,需要明确的是,锁并不完全特定于那把钥匙。相反,ConcurrentHashMap通常通过将地图分成多个段来工作,并且每个段有一个锁。这允许大量并发,并且通常是最有效的方法;但是你应该知道这意味着一些线程可能会阻塞你的对象创建,即使它们实际上没有接触到同一个键。
如果这对您来说是个问题,那么另一种方法是使用类似的ConcurrentHashMap<K, AtomicReference<V>>方法将添加地图条目与填充地图条目分离。(AtomicReference<V>没有一个computeIfAbsent方法,但在这一点上,你可以只用一般的双重检查用的密码锁定get()及synchronized。)
| 归档时间: |
|
| 查看次数: |
1649 次 |
| 最近记录: |