ConcurrentHashMap和SynchronizedHashMap的区别
admin
2023-07-30 20:15:31
0

ConcurrentHashMapSynchronizedHashMap都是线程安全的集合类,可以在多线程和并发的java应用程序中使用。但是它们之间存在着一些区别。在这篇文章中,我们来看看它们之间的所有这些差异。

ConcurrentHashMap

ConcurrentHashMap是一个实现了ConcurrentMap接口的类。它使用Hashtable,下划线数据结构。我们知道,在我们的应用程序中处理线程时,由于性能问题,HashMap不是一个好的选择。为了解决这个问题,我们在应用程序中使用ConcurrentHashMap。ConcurrentHashMap是线程安全的,因此多个线程可以毫无问题地对一个对象进行操作。在ConcurrentHashMap中,对象根据并发级别被划分为若干段。默认情况下,它允许16个线程在没有任何同步的情况下从Map中读和写。在ConcurrentHashMap中,任何数量的线程都可以在同一时间进行检索操作,但是对于对象的更新,线程必须锁定该线程想要操作的特定段。这种类型的锁定机制被称为段锁定或桶锁定。因此,在同一时间,线程可以进行16次更新操作。

ConcurrentHashMap示例代码:


import java.util.*;
import java.util.concurrent.*;

public class TraversingConcurrentHashMap {

    public static void main(String[] args)
    {

        // create an instance of ConcurrentHashMap
        ConcurrentHashMap chmap
            = new ConcurrentHashMap();

        // Add elements using put()
        chmap.put(110, "Yiibai");
        chmap.put(210, "for");
        chmap.put(310, "Geeks");
        chmap.put(410, "Welcome");
        chmap.put(510, "vsdiffer");

        // Create an Iterator over the
        // ConcurrentHashMap
        Iterator > itr = chmap.entrySet().iterator();

        while (itr.hasNext()) {
            ConcurrentHashMap.Entry entry
                = itr.next();
            System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
        }
    }
}

运行结果如下:

Key = 510, Value = vsdiffer
Key = 210, Value = for
Key = 410, Value = Welcome
Key = 110, Value = Yiibai
Key = 310, Value = Geeks

同步的HashMap

Java HashMap是一个非同步的集合类。如果我们需要对它进行线程安全的操作,那么必须明确地对它进行同步。java.util.Collections类的synchronizedMap()方法被用来同步它。它返回一个以指定映射为后盾的同步(线程安全)映射。

同步HashMap示例代码:


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

public class SynchronizedHashMap {
    public static void main(String args[])
    {

        // Creating a HashMap
        HashMap hmap = new HashMap();

        // Adding the elements using put method
        hmap.put(110, "yiibai");
        hmap.put(210, "for");
        hmap.put(310, "Geeks");
        hmap.put(215, "Welcome");
        hmap.put(410, "vsdiffer.com");

        // Creating a synchronized map
        Map map = Collections.synchronizedMap(hmap);
        Set set = map.entrySet();

        // Synchronize on HashMap, not on set
        synchronized (map)
        {
            Iterator i = set.iterator();
            // Printing the elements
            while (i.hasNext()) {
                Map.Entry me = (Map.Entry)i.next();
                System.out.print(me.getKey() + ": ");
                System.out.println(me.getValue());
            }
        }
    }
}

运行结果如下:

210: for
410: vsdiffer.com
215: Welcome
110: yiibai
310: Geeks

ConcurrentHashMap和Synchronized HashMap的区别。

ConcurrentHashMap Synchronized HashMap
ConcurrentHashMap是一个实现了ConcurrentMap和可序列化接口的类。 可以通过使用java.util.Collections类的synchronizedMap()方法来同步HashMap。
它锁定了映射的某些部分。 它锁定了整个映射。
ConcurrentHashMap允许执行并发的读和写操作。因此,性能相对来说比同步映射要好。 在Synchronized HashMap中,多个线程不能并发访问映射。因此,性能相对低于ConcurrentHashMap。
ConcuurentHashMap不允许插入空作为键或值。 同步HashMap允许插入null作为键。
ConccurentHashMap不抛出ConcurrentModificationException。 同步HashMap抛出ConcurentHashMap的ConcurrentModificationException。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...