展开

关键词

HashMap,HashTable,ConcurrentHashMap面试总结!!!

原文:https://www.cnblogs.com/hexinwei1/p/10000779.html 一、小总结 1、HashMap 、HashTable、 ConcurrentHashMap HashMap ConcurrentHashMap:利用CAS+Synchronized来保证并发的安全性。数据结构同HashMap。 2、ConcurrentHashMap如何实现线程安全? public static void demo1() { final Map<String, AtomicInteger> count = new ConcurrentHashMap<>(); 参考资料 / 相关推荐: 死磕Java并发—–J.U.C之Java并发容器:ConcurrentHashMap(http://cmsblogs.com/? p=2283) ConcurrentHashMap使用示例(https://my.oschina.net/mononite/blog/144329) ConcurrentHashMap使用示例(https

21920

面试阿里被质问:ConcurrentHashMap线程安全吗

技术言论虽然自由,但面对魔鬼面试官时,我们更在乎的是这些真的正确吗? 线程重用导致用户信息错乱 生产环境中,有时获取到的用户信息是别人的。 我们都知道ConcurrentHashMap是个线程安全的哈希表容器,但它仅保证提供的原子性读写操作线程安全。 开发人员误以为使用ConcurrentHashMap就不会有线程安全问题,于是不加思索地写出了下面的代码:在每一个线程的代码逻辑中先通过size方法拿到当前元素数量,计算ConcurrentHashMap ConcurrentHashMap对外提供能力的限制: 使用不代表对其的多个操作之间的状态一致,是没有其他线程在操作它的。 ConcurrentHashMap提供了一些原子性的简单复合逻辑方法,用好这些方法就可以发挥其威力。

44230
  • 广告
    关闭

    【玩转 Cloud Studio】有奖调研征文,千元豪礼等你拿!

    想听听你玩转的独门秘籍,更有机械键盘、鹅厂公仔、CODING 定制公仔等你来拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别

    Java5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。 HashMap基于哈希思想,实现对数据的读写。 HashTable和ConcurrentHashMap的区别? 使用 ConcurrentHashMap,其底层采用分段的数组+链表实现,线程安全,通过把 Map 分为 N 个 Segment(部分),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。 之所以效率低主要是使用了 synchronized 关键字对 put 等操作进行加锁,而 synchronized 关键字加锁是对整张 Hash 表的,即每次锁住整张表让线程独占,致使效率低下,而 ConcurrentHashMap 表划分为多个分段;而每个Segment元素,即每个分段则类似于一个Hashtable;这样,在执行put操作时首先根据hash算法定位到元素属于哪个Segment,然后对该Segment加锁即可,因此, ConcurrentHashMap

    57310

    面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别

    如果你去面试面试官不问你这个问题,你来找我^_^ 下面直接来干货,先说这三个Map的区别: HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个 从类图中可以看出来在存储结构中ConcurrentHashMap比HashMap多出了一个类Segment,而Segment是一个可重入锁。 ConcurrentHashMap是使用了锁分段技术来保证线程安全的。 ConcurrentHashMap提供了与Hashtable和SynchronizedMap不同的锁机制。 ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。

    55821

    面试中的HashMap、Hashtable和ConcurrentHashMap,你知道多少?

    前言 学过数据结构的读者们想必其实也都学过HashMap,面试官问你的时候,想来你都是很清楚的知道HashMap是怎样的一个构成?确实很简单,就是数组加链表嘛。 如果知道红黑树,那就能答出来;不知道的话那不是就凉了,因为这个时候连ConcurrentHashMap都需要放弃回答了!!! ConcurrentHashMap就线程安全的性能优化 说到ConcurrentHashMap,其实他和HashMap一样都是存在JDK1.8前后的版本差异的。 总结 其实总体来说就是性能上是HashMap > ConcurrentHashMap > Hashtable ,考虑上线程安全以后ConcurrentHashMap > Hashtable 。 也就是基于这些原因才会出现后来我们在使用ConcurrentHashMap出现来替代Hashtable的情况。

    21640

    ConcurrentHashMap详解

    www.jianshu.com/p/c0642afe03e0 http://www.cnblogs.com/huaizuo/archive/2016/04/20/5413069.html 在jdk1.6中ConcurrentHashMap 改进一:取消segments字段,直接采用transient volatile HashEntry 一、构造函数: public ConcurrentHashMap(int initialCapacity

    73030

    学习Java基础知识,打通面试关九~ConcurrentHashMap

    在上一篇文章中我们说到了Map集合中的一部分内容,还有并发包中的Map并没有说到,现在我们来说下并发包中的Map~ConcurrentHashMap。 Java8之前的ConcurrentHashMap 实现 在前期中ConcurrentHashMap的基本实现思路: ConcurrentHashMap 采用的是分段锁的设计方案,只有在同一个分段内的数据才会存在竞争关系 ConcurrentHashMap 也存在扩容的问题,这个跟HashMap类似,但是不是针对的整个ConcurrentHashMap,而是单独对Segment进行扩容。也会遇到同样的操作错误。 Java8的ConcurrentHashMap实现 在实现上放弃的Segment 的实现,采用了Node +CAS + Synchronized 来保证并发的安全。 ConcurrentHashMap 中操作的时候key value 不能是null 这样会出现操作问题。 初始化方法时使用的initTable,在调用的时候进行参数的设置。

    18620

    《吊打面试官》系列-ConcurrentHashMap & Hashtable(文末送书)

    于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写互联网技术栈面试相关的文章,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer 美丽迷人的面试官您好,一般在多线程的场景,我都会使用好几种不同的方式去代替: 使用Collections.synchronizedMap(Map)创建线程安全的map集合; Hashtable ConcurrentHashMap 不按照套路出牌呀,正常不都是问HashMap和ConcurrentHashMap么,这次怎么问了这个鬼东西,还好我饱读诗书,经常看敖丙的《吊打面试官》系列,不然真的完了。 总结 Hashtable&ConcurrentHashMap跟HashMap基本上就是一套连环组合,我在面试的时候经常能吹上很久,经常被面试官说:好了好了,我们继续下一个话题吧哈哈。 …… 加分项 在回答Hashtable和ConcurrentHashMap相关的面试题的时候,一定要知道他们是怎么保证线程安全的,那线程不安全一般都是发生在存取的过程中的,那get、put你肯定要知道

    45530

    ConcurrentHashMap总结

    s.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } 三、ConcurrentHashMap 下面简单分析ConcurrentHashMap的实现,相当精巧。 默认一个ConcurrentHashMap中有16个子HashMap,所以相当于一个二级哈希。 迭代操作: ConcurrentHashMap的历遍是从后向前历遍的,因为如果有另一个线程B在执行clear操作时,会把table中的所有slot都置为null,这个操作是从前向后执行 如果线程A在历遍 entrySet()){ System.out.println("key:" + entry.getKey()); } HashMap输出的是 key:1 key:2 ConcurrentHashMap

    21710

    图解ConcurrentHashMap

    浅谈ConcurrentHashMap 作者:HuYounger 博客:https://github.com/Rkhcy 文章目录 概述 ConcurrentHashMap是什么 源码分析 Java7 源码分析 稍微说下Java8 总结 0 概述 上篇文章介绍了 HashMap 在多线程并发情况下是不安全的,多线程并发推荐使用 ConcurrentHashMap ,那么 ConcurrentHashMap 这就是ConcurrentHashMap的设计思路,用一个图来理解 ? 从上图可以看出,此时锁的是对应的单个银行,而不是整个「银行者联盟」。 用一个图来表示 Java8 ConcurrentHashMap的样子 ? 3 总结 通过分析源码对比了 HashMap 与 ConcurrentHashMap的差别,以及Java7和Java8上 ConcurrentHashMap 设计的不同,当然还有很多坑没有填,比如其中调用了很多

    27221

    HashMap & ConcurrentHashMap

    HashMap底层原理是: 数组 + 链表 当链表长度大于8时 即链表长度等于9,链表结构就会转换为红黑树

    8220

    面试官:说说 ConcurrentHashMap 线程安全的实现原理?

    JDK1.7的ConcurrentHashMap 首先,将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。 ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。 java static class Segment extends ReentrantLock implements Serializable { } 一个 ConcurrentHashMap 里包含一个 JDK1.8的ConcurrentHashMap ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。

    5820

    深入解析 ConcurrentHashMap 实现内幕,吊打面试官?没问题

    ConcurrentHashMap 在 JDK 1.7 中的实现 在 JDK 1.7 版本及之前的版本中,ConcurrentHashMap 为了解决 HashTable 会锁住整个 hash 表的问题 JDK1.7 中,ConcurrentHashMap 的整体结构可以描述为下图的样子: [ConcurrentHashMap 1.7 存储结构] 我们对 ConcurrentHashMap 最关心的地方莫过于如何解决 JDK1.8 中的 ConcurrentHashMap 结构如下图所示: [JDK1.8 ConcurrentHashMap 结构图] 在这里我提一下 ConcurrentHashMap 默认构造函数, 我觉得这个地方比较有意思,ConcurrentHashMap 的默认构造函数如下: public ConcurrentHashMap() { } 发现没这个构造函数啥事没干,为啥要这样设计? <K,V>[] nt = (ConcurrentHashMap.Node<K,V>[])new ConcurrentHashMap.Node<?

    22330

    ConcurrentHashMap基础

    ConcurrentHashMap的实现 ConcurrentHashMap作为Concurrent一族,其有着高效地并发操作,相比Hashtable的笨重,ConcurrentHashMap则更胜一筹了 ConcurrentHashMap的属性 ConcurrentHashMap定义了如下几个常量: // 最大容量:2^30=1073741824 private static final int MAXIMUM_CAPACITY 所有插入ConCurrentHashMap的中数据都将会包装在Node中。 TreeNode 在ConcurrentHashMap中,如果链表的数据过长会转换为红黑树来处理。 所以TreeNode也必须是ConcurrentHashMap的一个核心类,其为树节点类。

    24620

    ConcurrentHashMap源码分析

    ConcurrentHashMap是一个可以用于并发环境的集合,在jdk8中实现的原理是CAS+synchronized put方法 public V put(K key, V value) {

    21910

    ConcurrentHashMap源码(二)

    return sum; } (1)元素的个数依据不同的线程存在在不同的段里; (2)计算CounterCell所有段及baseCount的数量之和; (3)获取元素个数没有加锁; 总结 (1)ConcurrentHashMap 是HashMap的线程安全版本; (2)ConcurrentHashMap采用(数组 + 链表 + 红黑树)的结构存储元素; (3)ConcurrentHashMap相比于同样线程安全的HashTable ,效率要高很多; (4)ConcurrentHashMap采用的锁有 synchronized,CAS,自旋锁,分段锁,volatile等; (5)ConcurrentHashMap中没有threshold 元素个数的更新如果还是出现多个线程同时更新一个段,则会扩容段(CounterCell); (17)获取元素个数是把所有的段(包括baseCount和CounterCell)相加起来得到的; (18)查询操作是不会加锁的,所以ConcurrentHashMap 不是强一致性的; (19)ConcurrentHashMap中不能存储key或value为null的元素; ConcurrentHashMap中有哪些值得学习的技术呢?

    16920

    爆肝ConcurrentHashMap

    摘要 JDK 1.7 CourrentHashMap实现 为什么放弃分段锁 JDK 1.8 CourrentHashMap实现 ConcurrentHashMap数据结构 ConcurrentHashMap 初始化 ConcurrentHashMap的hash算法 Unsafe.getObjectVolatile方法 ConcurrentHashMap的put操作 ConcurrentHashMap如何判断扩容 ConcurrentHashMap扩容 红黑树退化为链表 学会问自己 1. JDK 1.8 ConcurrentHashMap实现 JDK1.8 ConcurrentHashMap底层的数据结构采用的是数组+链表+红黑树的存储结构,并且放弃了分段锁,利用CAS+Synchronized JDK 1.8 ConcurrentHashMap初始化 ConcurrentHashMap初始化过程并不是在构造的时候,而是在第一次进行put操作的时候通过initTable()方法来进行初始化。

    19520

    ConcurrentHashMap源码阅读

    ConcurrentHashMap是支持高并发、高吞吐量的线程安全的Map实现。下面会通过阅读 ConcurrentHashMap 在 JDK1.7 和 JDK1.8 的源码来了解它的演变过程。 ConcurrentHashMap的数据结构如下: ? ConcurrentHashMap 由 Segment 数组和 HashEntry 数组组成。 一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构和 HashMap 类似,是一种数组和链表结构。 结构 ConcurrentHashMap:下面是ConcurrentHashMap中的数据成员以及构造函数源码: 构造函数主要做了两件事:1)参数的校验;2)table初始化长度 public class ConcurrentHashMap在JDK1.8中的改进 3.1.

    50870

    扫码关注腾讯云开发者

    领取腾讯云代金券