java - 如何在并发 HashMap 中声明一个易变列表?

标签 java

我有一个变量:

ConcurrentHashMap<String, List<AnObjectType>> mapOfList;

据我了解,List 不是线程安全的。但我不想使用 Synchronized 关键字,因为我实际上想要对列表进行并发读取访问和同步写入,而不是阻止读取和写入。

所以我通常会声明 Volatile像这样在变量上:

volatile List<AnObjectType> varName;

(虽然在这种情况下我认为 this referers 是列表上的 Volatile 引用,但我想要的是列表引用和列表的内容都是易变的。)

但是我如何在 ConcurrentHashMap 构造中做到这一点,因为我没有将列表声明为变量而是在方法中的任何地方?

即列表在方法中创建:

if (!mapOfList.containsKey("ListA")) {
     List<AnObjectType> listA=new ArrayList<AnObjectType>();
     mapOfList.put("ListA", listA);
}

并且在同一个类中的另一个方法中访问列表:

List<AnObjectType> listA=mapOfList.get("ListA");
if (listA!=null) {
     // Do something concurrent with listA.
}

子问题:这样的东西真的有用吗?

ConcurrentHashMap<String,List<AtomicReference<AnObjectType>>>>

列表操作详解:

列表将通过多个线程几乎不断地读取来访问。对列表的写访问将在特定条件下触发。所以我想要的是对列表内容的并发访问,很少对列表内容进行写入操作,写入操作后的所有读取都应该反射(reflect)出来。

最佳答案

使用 ConcurrentMap#putIfAbsent 创建 List,并在惰性 getter 中访问所有列表:

List<AnObjectType> getList(String key) {
     if (!mapOfList.containsKey(key)) {
     // This list might not end up being the one that gets returned, but
     // that's OK
         mapOfList.putIfAbsent(key, new CopyOnWriteArrayList<AnObjectType>());
     }
     return mapOfList.get(key);
}

CopyOnWriteArrayList 应该可以为您提供所需的同步性能。

关于java - 如何在并发 HashMap 中声明一个易变列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8443600/

相关文章:

Java VisualVM (jvisualvm) 工具在启动时抛出警告 "could not install some modules"

java - Maven 如何影响 Java Web 应用程序?

java - InflateException 二进制 XML 文件,第 7 行 : Error inflating class fragment

java - null==instance 而不是 instance==null

java - 将构造函数与 Integer 一起使用

java - 如何修复 java.lang.UnsupportedClassVersionError : Unsupported major. 次要版本

java - 在我的登录 JPanel 中添加 KeyListener

java - 画家的奇怪行为

java - 为什么 Java 不能准确检测 while 循环中的 if 语句?

java - 如何在一个应用程序中的多个 Activity 之间共享蓝牙接收的数据