java - 如何同步访问 Java Hashmap 中的值?

标签 java arraylist hashmap

假设我有一个 Java Hashmap,其中键是字符串或其他内容,值是其他值的列表,例如

Map<String,List<String>> myMap=new HashMap<String,List<String>>();
//adding value to it would look like this
myMap.put("catKey", new ArrayList<String>(){{add("catValue1");}} );

如果我们有许多线程在列表中添加和删除值(不更改键,只是更改 HashMap 的值),是否有办法使对列表的访问仅是线程安全的?这样多个线程可以同时编辑多个值?

最佳答案

使用同步或并发列表实现而不是 ArrayList ,例如

最后一个不是列表,但如果您实际上不需要按索引访问(即随机访问),则很有用,因为它的性能比其他列表更好。

<小时/>

请注意,由于您可能需要将初始空列表并发插入到新键的映射中,因此您应该使用 ConcurrentHashMap 对于Map本身,而不是简单的 HashMap .

<小时/>

建议

Map<String, Deque<String>> myMap = new ConcurrentHashMap<>();

// Add new key/value pair
String key = "catKey";
String value = "catValue1";
myMap.computeIfAbsent(key, k -> new ConcurrentLinkedDeque<>()).add(value);

上面的代码在向映射添加新键时是完全线程安全的,在向列表添加新值时也是完全线程安全的。该代码不会花费时间获取同步锁,并且不会遭受 CopyOnWriteArrayList 所带来的性能下降。当列表变大时有。

唯一的问题是它使用 Deque ,不是List ,但实际情况是 List 的大多数用途可以很容易地使用 Deque ,但指定 List出于习惯,所以这可能是一个可以接受的改变。

关于java - 如何同步访问 Java Hashmap 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60468312/

相关文章:

rust - 收集到 HashMap 时是否可以检测冲突?

java - 当 HashMap 值第一次出现时,我怎么会出现 'break' 呢?

java - workspace.xml 文件已损坏(第 1 行错误 : Content is not allowed in prolog) in IntelliJ, 我该如何修复?

java - java中给定字符串的线性搜索?还有更好的解决方案吗?

java - 实例方法返回十六进制而不是字符串

Java 深度克隆 - 如果可克隆,则克隆 ArrayList 中的每个元素,无论类型如何

java - 为什么 jmf 不能播放 rtp 流?

java - 为什么在插入 LinkedList 和 ArrayList 时得到关于时间的不同输出

java - 使用反射将未知类的对象添加到 ArrayList

java - 从仅包含重复值的映射中提取子映射