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

在ConcurrentHashMap中修改值的首选方法是什么?

巩光誉
2023-03-14
问题内容

假设我有一个并发映射,该映射具有高读,低写且需要存储应用程序数据:

ConcurrentMap<UUID, Data> map = new ConcurrentHashMap<UUID, Data>();

然后,在启动过程中并通过用户输入,将数据添加到地图:

public void createData(Data newData) {
    map.put(newId, newData); // etc...
}

如果随后需要更改数据,我应该:

A)使Data类对象不可变,然后在每次需要更改Data对象时进行放置操作:

public void changeData(UUID oldId, Foo newInfo) {
    Data oldData = map.get(oldId);
    Data newData = new Data(oldData, newInfo); // Constructor for demo only
    map.put(newData);
    saveToDatabase(newData);
}

B)使用易失性字段,原子引用或最终并发字段,使Data类对象易变但具有线程安全性,只需根据需要修改对象:

public void changeData(UUID oldId, Foo newInfo) {
    Data data = map.get(id);
    data.changeSomething(newInfo);
    saveToDatabase(data);
}

C)以上都不是


问题答案:

A)是更好的选择,原因有两个:

  1. 由于在您的方案中读取更为频繁,因此应减少读取的开销。volatile在这种情况下,添加其他同步操作(例如)会不利于您。
  2. 通过将可变对象与其他自定义保护措施结合使用(可能存在错误),您几乎可以克服通过使用使生活更轻松的目的ConcurrentHashMap


 类似资料:
  • 问题内容: 假设我有一个普通对象列表,然后可以用来呈现子级列表。那么将对象插入其中的正确方法是什么? 以下是我认为它将起作用的唯一方法,因为您不能像文档中提到的那样直接更改。 这对我来说似乎很丑。有没有更好的办法? 问题答案: 返回一个新数组,所以你可以做 另一个选择是React的不变性助手

  • 问题内容: 由于无法更改,因此我想知道如何更有效地连接字符串? 我可以这样写: 或像这样: 问题答案: 将字符串附加到字符串变量的最佳方法是使用+或+=。这是因为它可读且快速。它们的速度也一样快,你选择的是一个品味问题,后者是最常见的。以下是该timeit模块的计时: 但是,那些建议拥有列表并附加到列表然后再连接这些列表的人之所以这样做,是因为与扩展字符串相比,将字符串附加到列表可能非常快。在某些

  • 每个插件都可以定义自己的内容(通过),这些内容应该添加到我的应用程序中的特定位置(进入)。在该中可以看到的插件中总是只有一个。 我找不到实现这一目标的首选方法。我应该用插件中的新部分替换当前可见的部分吗?或者只是以某种方式设置已经可见的部分的内容(可能通过setContributionUri)。 我查看了。看起来它可以根据实例化,但它只有一些方法可以使新的可见。我需要将新的添加到现有的中,并可能删

  • 问题内容: 我想通过提供一个调用用户函数的接口来为我的一个模块的用户提供扩展其功能的能力。例如,我想让用户能够在创建类的实例时得到通知,并有机会在使用该实例之前对其进行修改。 我实现它的方法是声明一个执行实例化的模块级工厂函数: 然后,当我在mymodule中需要一个类的实例时,我会做而不是。 为了扩展它,程序员将在另一个模块中编写如下函数: 上面的回调的安装如下所示: 这对我来说似乎很简单,但是

  • 问题内容: 在JavaScript中定义枚举的首选语法是什么?就像是: 还是有更好的成语? 问题答案: 从1.8.5开始,可以密封和冻结对象,因此将以上定义为: 要么 和瞧!JS枚举。 但是,这不会阻止您为变量分配不需要的值,这通常是枚举的主要目标: 确保类型安全性(使用枚举或其他方式)的程度更高的一种方法是使用诸如TypeScript或Flow之类的工具。 不需要引号,但为了保持一致性,我保留了

  • 因为Python的不能更改,我想知道如何更有效地连接字符串? 我可以这样写: 或者像这样: 在写这个问题的时候,我发现了一篇谈论这个话题的好文章。 http://www.skymind.com/~ocrow/python_string/ 但是它是在Python2.x中,所以问题是Python3中是否做了一些更改?