如何在 Java 中同步 HashMap

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(399)   2023-06-26 07:54:18

Java HashMap 默认是不同步的。如果我们在多个线程正在添加和删除对的并发应用程序中从 HashMap 添加/删除键值对,我们最终可能会出现不一致的映射状态。学习同步 hashmapConcurrentHashMap 在 Java 中。

1、同步HashMap——ConcurrentHashMap

如果我们希望在并发环境中使用 Map,我们的首选应该始终是使用 ConcurrentHashMap 类。 ConcurrentHashMap 通过设计支持并发访问它的键值对。我们不需要执行任何额外的代码修改来启用地图同步。

请注意,从 ConcurrentHashMap 获得的 iterator 不会抛出 ConcurrentModificationException。但是,迭代器被设计为一次只能由一个线程使用。这意味着我们从 ConcurrentHashMap 获得的每个迭代器都设计为由单个线程使用,不应传递。

如果我们这样做,则无法保证一个线程会看到另一个线程对映射所做的更改(无需从映射中获取新的迭代器)。 迭代器保证反映地图在创建时的状态

让我们举一个使用 ConcurrentHashMap 的例子。

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

public class HashMapExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        ConcurrentHashMap<Integer, String> concurrHashMap = new ConcurrentHashMap<>();
        
        //Put require no synchronization
        concurrHashMap.put(1, "A");
        concurrHashMap.put(2, "B");
        
        //Get require no synchronization
        concurrHashMap.get(1);
        
        Iterator<Integer> itr = concurrHashMap.keySet().iterator();
        
        //Using synchronized block is advisable
        synchronized (concurrHashMap) 
        {
            while(itr.hasNext()) {
                System.out.println(concurrHashMap.get(itr.next()));
            }
        }
    }
}

程序输出。

A
B

2.同步HashMap——Collections.synchronizedMap()

Synchronized HashMap 的工作方式也与 ConcurrentHashMap 非常相似,只有很少的区别。

SynchronizedHashMap 一次只允许一个线程执行读/写操作,因为它的所有方法都被声明为同步ConcurrentHashMap 允许多个线程在映射中的不同段上独立工作。这允许在 ConcurrentHashMap 中实现更高程度的并发,从而提高整个应用程序的性能。

来自这两个类的迭代器应该在 synchronized 块中使用,但是来自 SynchronizedHashMap 的迭代器是fail-fast。 ConcurrentHashMap 迭代器不是快速失败的。

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class HashMapExample 
{
    public static void main(String[] args) throws CloneNotSupportedException 
    {
        Map<Integer, String> syncHashMap = Collections.synchronizedMap(new HashMap<>());
        
        //Put require no synchronization
        syncHashMap.put(1, "A");
        syncHashMap.put(2, "B");
        
        //Get require no synchronization
        syncHashMap.get(1);
        
        Iterator<Integer> itr = syncHashMap.keySet().iterator();
        
        //Using synchronized block is advisable
        synchronized (syncHashMap) 
        {
            while(itr.hasNext()) {
                System.out.println(syncHashMap.get(itr.next()));
            }
        }
    }
}

程序输出。

A
B

3.SynchronizedHashMap与ConcurrentHashMap的区别

让我们找出两个版本的地图之间的一些差异,以便我们可以决定在哪种情况下选择哪个版本。

  1. 多个线程可以从 ConcurrentHashMap 添加/删除键值对,而在 SynchronizedHashMap 的情况下只允许一个线程进行更改。这导致 ConcurrentHashMap 的并发度更高。
  2. 无需锁定映射即可读取 ConcurrentHashMap 中的值。检索操作将返回由最近完成的插入操作插入的值。 SynchronizedHashMap 中的读操作也需要锁。
  3. ConcurrentHashMap 不会抛出 ConcurrentModificationException 如果一个线程试图修改它而另一个正在迭代它。迭代器反映了映射在创建时的状态。 SynchronizedHashMap 返回迭代器,它在并发修改时快速失败。

快乐学习!!

阅读更多 :

Java HashMap 指南 HashMap Java 文档 ConcurrentHashMap Java 文档

标签2: Java HashMap Java Map
地址:https://www.cundage.com/article/synchronize-hashmap.html

相关阅读

Java HashMap 默认是不同步的。如果我们在多个线程正在添加和删除对的并发应用程序中从 HashMap 添加/删除键值对,我们最终可能会出现不一致的映射状态。学习同步 hashmap 和...
学习用 Java 创建HashMap 的克隆。我们将看到用于创建 HashMap 的浅拷贝 和深拷贝 的 java 程序。 更多参考:Java 克隆指南 1. Clone HashMap——浅拷...
Java HashMap 是 Collections 框架 的成员,用于存储键值对。每个键映射到单个值,并且不允许重复键。在本教程中,我们将了解HashMap 如何在内部存储键值对以及它如何防止...
了解在 Java 中通过键、值和键值对比较两个散列映射的不同方法。此外,学习在允许或限制重复值的同时比较地图。 1.比较相同键和值的映射 1.1.使用 Map.equals() 默认情况下,Ha...
HashMap 基于哈希算法工作,根据 Java 文档 HashMap 有以下四个构造函数, 构造函数 描述 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap
在上一篇文章中,我向您展示了如何在 Java 8 中通过键对 Map 进行排序,今天,我将教您使用 Java 如何通过值对 Map 进行排序 8 个特征,例如lambda 表达式、方法引用、流和...
Java 教程中的 HashMap 迭代展示了如何在 Java 中迭代 HashMap。 Java哈希表 哈希表是一个存储键值对的容器。每个键都与一个值相关联。 HashMap 中的键必须是唯一...
Java中的LinkedHashMap用于存储键值对,非常类似于HashMap类。不同之处在于 LinkedHashMap 维护插入其中的元素的顺序,而 HashMap 是无序的。 在这个 Ja...
对于入门级 Java 程序员,您可以期待这个关于 Hashtable 与哈希图。尽管当您了解其他概念(例如 hashmap 是如何工作的,但是在从我的博客读者那里得到许多准备或工作在初级水平的问...
在“HashMap 如何在 Java 中工作“,我们了解了 HashMap 或 ConcurrentHashMap 类的内部结构,以及它们如何融入整个概念。但是当面试官问你HashMap相关概念...