一尘不染

ConcurrentHashMap与基于ReentrantReadWriteLock的自定义地图进行重新加载

java

Java专家

目前,我们有一个HashMap<String,SomeApplicationObject>正被 频繁地读取和修改偶尔
,我们有问题的修改过程中/重装, 操作返回null这是不能接受的。

为了解决这个问题,我有以下选择:

A.使用
ConcurrentHashMap

看起来像是首选,但是我们所讨论的操作是reload()-表示clear()紧随其后replaceAll()。因此,如果在Map读后读clear()pre,replaceAll()则返回null,这是不希望的。即使我synchronize不能解决问题。

B.基于
ReentrantReadWriteLock
创建另一个实现

我将Write Lockreload()手术前创建获取的位置。这似乎更合适,但是我觉得必须已经有一些可用的东西了,我不需要重新发明轮子。

最好的出路是什么?

编辑 是否已有任何具有此类功能的收藏夹?


阅读 353

收藏
2020-12-03

共1个答案

一尘不染

似乎您不确定Peter Lawrey的建议如何实施。它可能看起来像这样:

class YourClass {
    private volatile Map<String, SomeApplicationObject> map;

    //constructors etc.

    public void reload() {
        Map<String,SomeApplicationObject> newMap = getNewValues();
        map = Collections.unmodifiableMap(newMap);
    }
}

没有并发问题,因为:

  • 新地图是通过局部变量创建的,根据定义,该局部变量不会共享- getNewValues不需要同步或原子
  • 分配给map原子
  • map 是易失的,保证其他线程可以看到更改
2020-12-03