当前位置: 首页 > 面试题库 >

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

柳正志
2023-03-14
问题内容

Java专家

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

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

A.使用
ConcurrentHashMap

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

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

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

最好的出路是什么?

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


问题答案:

似乎您不确定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 是易失的,保证其他线程可以看到更改


 类似资料:
  • 如果这看起来微不足道,我道歉。 我一直致力于我的第一个Android应用程序,并想就实现加载/飞溅屏幕附加的最佳方式提出建议。 我的设计师提出的是加载/启动屏幕,我不知道如何实现这一点。 我是否要求设计师创建一个。gif图像我可以直接播放或 请注意,自行车从左侧开始,然后继续向右行驶,带有进度指示器和百分比。 选项2是否可行?如果可以,请您给我指一下我可以用作指导的任何资源。 谢谢

  • 问题内容: 由于某种原因,propel不会为视图表生成模型,如果您使用该任务,它甚至不包括视图表的结构。因此,我别无选择,只能使用自定义查询。我知道如果模型存在该怎么办: 但是由于propel不会为我的视图表生成模型,所以我不知道该怎么做。我已经尝试过了,但是没有用 我真的需要这项工作。请帮忙 :) 问题答案: 您将获得当前的数据库连接,并且可以进行所需的任何SQL查询,

  • 我感兴趣的是创建一个或多个自定义属性源加载器,并在我的应用程序中使用那些带有的属性源。 例如,我想开发一个属性源加载器,它能够加载XML文件并将其转换成一组属性,这些属性可以注入到我的< code>@Configuration注释类中。 是否有任何此类基于 XML 的属性源加载程序公开可用?如果没有,那么一旦我实现了它,我将如何将其提供给我的应用程序? 谢谢。

  • EasySwoole中支持添加用户自定义的swoole process。 抽象父类 任何的自定义进程,都应该继承自EasySwoole\Core\Swoole\Process\AbstractProcess, AbstractProcess实现代码如下: <?php /** * Created by PhpStorm. * User: yf * Date: 2018/1/17 * Time

  • 禁止DisableNastyThing1或DisableNastyThing2的工作方式与禁止模块完全相同。换句话说,myCheck XML元素名将表示这样一个事实,即该检查没有映射到实现AbstractCheck的实际Java类,而是映射到执行嵌套在其中的检查的一些通用检查。 是不是Checkstyle中已经有这样的概念,而我却没能找到它,还是怎么的?

  • 在使用网页视图时,我可以使用重新加载()来刷新网页。但是在Chrome自定义标签中,我如何重新加载网页?请引导我。 谢谢