首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >并发容器之ConcurrentHashMap(1)

并发容器之ConcurrentHashMap(1)

作者头像
黑洞代码
发布于 2021-03-19 10:02:47
发布于 2021-03-19 10:02:47
61500
代码可运行
举报
运行总次数:0
代码可运行

内容

SynchronizedMapHashtableConcurrentHashMap

SynchronizedMap

HashMap不是线程安全的,即在并发场景下,多个线程共享一个HashMap对象,将会出现程序紊乱。在并发场景下如果要保证一种可行的方式是使用 Collections.synchronizedMap() 方法来包装我们的 HashMap。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Collections.synchronizedMap()源码,返回一个SynchronizedMap对象
 */
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
    return new SynchronizedMap<>(m);
}


/**
 * SynchronizedMap源码
 */
private static class SynchronizedMap<K,V>
        implements Map<K,V>, Serializable {
        private static final long serialVersionUID = 1978198479659022715L;
        /**
         * SynchronizedMap内部依靠Map实现常见的K-V操作。
         */
        private final Map<K,V> m;     // Backing Map
        /**
         * 锁对象,用于控制SynchronizedMap内部的Map对象m的线程安全。
         */
        final Object      mutex;        // Object on which to synchronize

        SynchronizedMap(Map<K,V> m) {
            this.m = Objects.requireNonNull(m);
            mutex = this;
        }

        SynchronizedMap(Map<K,V> m, Object mutex) {
            this.m = m;
            this.mutex = mutex;
        }

        public int size() {
            synchronized (mutex) {return m.size();}
        }
        public boolean isEmpty() {
            synchronized (mutex) {return m.isEmpty();}
        }
        ······

SynchronizedMap示意图

Hashtable

与SynchronizedMap类似,Hashtable也是通过synchronized实现线程安全的,不同的是,Hashtable并没有借助内部的属性作为锁对象,而是在每个方法上加上了synchronized关键字,即Hashtable使用的锁对象是Hashtable对象本身。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable {

    /**
     * The hash table data.
     */
    private transient Entry<?,?>[] table;

    /**
     * The total number of entries in the hash table.
     */
    private transient int count;

    /**
     * The table is rehashed when its size exceeds this threshold.  (The
     * value of this field is (int)(capacity * loadFactor).)
     *
     * @serial
     */
    private int threshold;

    /**
     * Returns the number of keys in this hashtable.
     *
     * @return  the number of keys in this hashtable.
     */
    public synchronized int size() {
        return count;
    }

    /**
     * Tests if this hashtable maps no keys to values.
     *
     * @return  <code>true</code> if this hashtable maps no keys to values;
     *          <code>false</code> otherwise.
     */
    public synchronized boolean isEmpty() {
        return count == 0;
    }
    ······

ConcurrentHashMap

SynchronizedMap和Hashtable都是通过使用一个全局的锁来同步不同线程间的并发访问,因此会带来不可忽视的性能问题——锁的粒度是方法级的,因此同一个方法无法在多线程环境下并发执行。于是就有了 HashMap 的线程安全版本—— ConcurrentHashMap 的诞生。在 ConcurrentHashMap 中,无论是读操作还是写操作都能保证很高的性能:在进行读操作时(几乎)不需要加锁,而在写操作时,JDK1.7JDK1.8分别使用了不同的方式实现了线程安全。

JDK 1.7 ConcurrentHashMap

JDK 1.8 ConcurrentHashMap

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 落叶飞翔的蜗牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何保证容器是线程安全的? ConcurrentHashMap 如何高效的线程安全?
Java提供了不同层面的线程安全支持。在传统集合框架内部,除了 Hashtable等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用Collections工具类提供的包装方法,来获取一个同步的包装容器(如 Collections.synchronizedMap),但是它们都是利用非常粗粒度的同步方式,在高并发情况下,性能比较低下。其实可以利用并发包提供的线程安全容器。
王小明_HIT
2020/05/12
1.2K0
Collections.synchronizedMap()、ConcurrentHashMap、Hashtable之间的区别
为什么要比较Hashtable、SynchronizedMap()、ConcurrentHashMap之间的关系?因为常用的HashMap是非线程安全的,不能满足在多线程高并发场景下的需求。 那么为什么说HashTable是线程不安全的? 如何线程安全的使用HashMap 了解了 HashMap 为什么线程不安全,那现在看看如何线程安全的使用 HashMap。这个无非就是以下三种方式: Hashtable ConcurrentHashMap Synchronized Map Hashtable 那先说说Ha
Tanyboye
2018/07/02
1.2K0
哪些线程是安全的_redis是线程安全的吗
Java中平时用的最多的map就是hashmap但是它却是线程不安全的。 那除了hashmap还有哪些常见的线程安全的map? 1.hashtable Map<String,Object> hashtable=new Hashtable<String,Object>();
全栈程序员站长
2022/08/03
1.4K0
Java - 线程安全的 HashMap 实现方法及原理
转载自 http://liqianglv2005.iteye.com/blog/2025016
allsmallpig
2021/02/12
3K0
Java - 线程安全的 HashMap 实现方法及原理
集合之ConcurrentHashMap & Hashtable
不过出于线程并发度的原因,一般舍弃前两者使用最后的ConcurrentHashMap,他的性能和效率明显高于前两者。
Vincent-yuan
2021/08/31
3130
集合之ConcurrentHashMap & Hashtable
深入解析 ConcurrentHashMap 实现内幕,吊打面试官?没问题
在开发中,我们经常使用 HashMap 容器来存储 K-V 键值对,但是在并发多线程的情况下,HashMap 容器又是不安全的,因为在 put 元素的时候,如果触发扩容操作,也就是 rehash ,就会将原数组的内容重新 hash 到新的扩容数组中,但是在扩容这个过程中,其他线程也在进行 put 操作,如果这两个元素 hash 值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。
平头哥的技术博文
2019/12/10
5140
浅入浅出 Java ConcurrentHashMap
HashMap 是 Java 中非常强大的数据结构,使用频率非常高,几乎所有的应用程序都会用到它。但 HashMap 不是线程安全的,不能在多线程环境下使用,该怎么办呢?
沉默王二
2020/09/04
4100
浅入浅出 Java ConcurrentHashMap
​让我们来看看,多线程下的Map是如何实现线程安全的
上一篇文章<<手撕HashMap>>是在大考周前写的有关HashMap的文章,在其开头开头提到过ConcurrentHashMap和HashTable,因为既然讲到了Map那么就绕不开,HashMap、HashTable、ConcurrentHashMap这三兄弟,先简单介绍一下这两个新朋友:HashTable是遗留类,ConcurrentHashMap类是有点高级的,说实话在写这篇文章前,这两个类我是没用过,不是说它不重要,只能说我层次还没到。在阅读本篇文章时,我强烈建议大家先去看看<<手撕HashMap>>
东边的大西瓜
2022/05/05
6050
​让我们来看看,多线程下的Map是如何实现线程安全的
《吊打面试官》系列-ConcurrentHashMap & Hashtable(文末送书)
作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(请允许我使用一下夸张的修辞手法)。
敖丙
2019/12/19
8060
《吊打面试官》系列-ConcurrentHashMap & Hashtable(文末送书)
[Java并发系列]Java并发容器和框架
使用Java并发容器/框架可以提高并发程序的开发效率,设计出更加优秀的并发程序。Java并发容器/框架还是位于java.util.concurrent包中。常用的并发容器有如下: ConcurrentHashMap ConcurrentLinkedQueue 阻塞队列 1. ConcurrentHashMap 的实现原理与使用(基于1.7) ConcurrentHashMap 是线程安全且高效的HashMap,它可以在保证线程安全的同时可以保证高效的操作。 1. HashMap在并发环境中的问题 ① 在
用户2017109
2018/06/19
7280
HashMap面试题,看这一篇就够了!
在后端的日常开发工作中,集合是使用频率相当高的一个工具,而其中的HashMap,则更是我们用以处理业务逻辑的好帮手,同时HashMap的底层实现和原理,也成了面试题中的常客。
天之痕苏
2019/12/18
1.3K0
HashMap面试题,看这一篇就够了!
Java常用并发容器总结(一)
众所周知,ArrayList、HashMap等类是线程不安全的,在高并发场景下无法使用。解决这个问题的办法之一是使用Collections工具类的synchronizedMap和synchronizedList等方法,将集合包装成线程安全的。
张申傲
2020/09/03
2350
如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
先前介绍了 Java 集合框架 的典型容器类,它们绝大部分都不是线程安全的,仅有的线程安全实现,比如 Vector、Stack,在性能方面也远不尽如人意。幸好 Java 语言提供了并发包(java.util.concurrent),为高度并发需求提供了更加全面的工具支持
码农架构
2020/10/26
6470
如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
Java同步容器和并发容器
同步容器的同步原理就是在方法上用 synchronized 修饰。那么,这些方法每次只允许一个线程调用执行。
李红
2019/05/29
7520
【JAVA】ConcurrentHashMap 如何实现高效地线程安全?
之前介绍了 Java 集合框架的典型容器类,它们绝大部分都不是线程安全的,仅有的线程安全实现,比如 Vector、Stack,在性能方面也远不尽如人意。幸好 Java 语言提供了并发包(java.util.concurrent),为高度并发需求提供了更加全面的工具支持。
sidiot
2023/08/31
3480
【JAVA】ConcurrentHashMap 如何实现高效地线程安全?
数据结构?从HashMap的源码分析开始!
首先,先看下inflateTable方法,这个是初始化HashMap里面的线性表的空间:
大大大大大先生
2018/09/04
3830
数据结构?从HashMap的源码分析开始!
理解Java8并发工具类ConcurrentHashMap的实现
前面的文章已经分析过List和Queue相关的接口与并发实现类,本篇我们来分析一下非常Java里面非常重要的一个数据结构HashMap。(注意Set类型在这里我们不在单独分析,因为Set本身并不能算一种数据结构,它可以借助任何其他数据结构如array或者map类来实现。)
我是攻城师
2018/09/30
1K0
理解Java8并发工具类ConcurrentHashMap的实现
Java并发容器--ConcurrentHashMap
  1、不安全:大家都知道HashMap不是线程安全的,在多线程环境下,对HashMap进行put操作会导致死循环。是因为多线程会导致Entry链表形成环形数据结构,这样Entry的next节点将永远不为空,就会产生死循环获取Entry。具体内容见HashMap随笔。
在周末
2019/09/11
4900
并发容器和框架之ConcurrentHashMap
了解HashMap的人都知道HashMap是线程不安全的(多线程下的put方法达到一定大小,引发rehash,导致闭链,最终占满CPU),同时线程安全的HashTable效率又令人望而却步(每个方法都进行同步,效率低下),所以在这种情境下为并发而生的ConcurrentHashMap就应运而生! 接下来我们按照以下顺序揭开ConcurrentHashMap的面纱: JDK1.6,1.7的ConcurrentHashMap JDK1.8的ConcurrentHashMap 1.1 ConcurrentHas
MindMrWang
2018/04/16
1.1K0
并发容器和框架之ConcurrentHashMap
Java基础之HashTable与ConcurrentHashMap解析
在面试的过程中,经常会被问到HashTable和HashMap的区别,下面就这些区别做一个简单的总结。
xiangzhihong
2022/11/30
3860
推荐阅读
相关推荐
如何保证容器是线程安全的? ConcurrentHashMap 如何高效的线程安全?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档