ConcurrentHashMap(JDK1.8)put分析】的更多相关文章

今天看到一篇博客:jdk1.8的HashMap和ConcurrentHashMap,我想起了前段时间面试的一个问题:ConcurrentHashMap(JDK1.8)为什么要使用synchronized而不是可重入锁? 我想从下面几个角度讨论这个问题: 锁的粒度 首先锁的粒度并没有变粗,甚至变得更细了.每当扩容一次,ConcurrentHashMap的并发度就扩大一倍. Hash冲突 JDK1.7中,ConcurrentHashMap从过二次hash的方式(Segment -> HashEntr…
ConcurrentHashMap是在jdk1.5版本开始,存在于java.util.concurrent包下.本文主要是针对jdk1.7版本. 由于HashMap是非线程安全的,HashTable虽然是线程安全的,但是它的实现是对整个哈希表加锁,这样的话,效率很低下. ConcurrentHashMap是线程安全的实现,像是对HashTable做的优化,但是它使用的是分段锁机制.ConcurrentHashMap的底层 也是使用基于数组+链表的数据结构.具体结构如下代码所示: /** * Th…
1. Concurrent相关历史 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器(bins)时,吞吐量严重降低.因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了Java.util.concurrent包,在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点挺符…
之前介绍了Java并发的基础知识和使用案例分析,接下来我们正式地进入Java并发的源码分析阶段,本文作为源码分析地开篇,源码参考JDK1.8 OverView: JDK1.8源码中的注释提到:ConcurrentHashMap是一种提供完整的并发检索和对于并发更新有高预测性的散列表,遵循了与HashMap相同的功能性规格,并包含与HashTable每个方法都对应的方法.虽然所有操作都是线程安全的,但检索操作并不牵涉任何锁,不支持任何锁住整个散列表来保护所有的访问. ConcurrentHashM…
大家可能平时用HashMap比较多,相对于ConcurrentHashMap 来说并不是很熟悉.ConcurrentHashMap 是 JDK 1.5 添加的新集合,用来保证线程安全性,提升 Map 集合的并发效率.ConcurrentHashMap 使用了 Segment 的概念,默认有 16 个 Segment(段,块,部分),Segment 里面依然还是数组 + 链表的数据结构,相当于给 HashMap 分桶处理了.因每次只会锁住其中一个 Segment,所以性能非常好.然而,有意思的是,…
前言 ConcurrentHashMap 是并发中的重中之重,也是最常用的数据结果,之前的文章中,我们介绍了 putVal 方法.并发编程之 ConcurrentHashMap(JDK 1.8) putVal 源码分析.其中分析了 initTable 方法和 putVal 方法,但也留下了一句话: 这篇文章仅仅是 ConcurrentHashMap 的开头,关于 ConcurrentHashMap 里面的精华太多,值得我们好好学习. 说道精华,他的扩容方法绝对是精华,要知道,Concurrent…
参考:https://www.jianshu.com/p/c0642afe03e0 CAS的思想很简单:三个参数,一个当前内存值V.旧的预期值A.即将更新的值B,当且仅当预期值A和内存值V相同时,将内存值修改为B并返回true,否则什么都不做,并返回false. 细节参考:https://www.jianshu.com/p/fb6e91b013cc 参考:http://blog.csdn.net/u010412719/article/details/52145145 https://www.ji…
前言 HashMap非线程安全的,HashTable是线程安全的,所有涉及到多线程操作的都加上了synchronized关键字来锁住整个table,这就意味着所有的线程都在竞争一把锁,在多线程的环境下,它是安全的,但是无疑效率低下的. ConcurrentHashMap(JDK1.7) 在JDK1.7中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成的,如图: Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,…
6.1 hash算法 就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 为了使得hash出来的值更加均衡,在concurrentHashMap里面使用了Wang/Jenkins hash算法再做了一次hash. 6.2 源码 6.2.1 构造方法 //DEFAULT…
    ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁.如图   左边便是Hashtable的实现方式---锁整个hash表:而右边则是ConcurrentHashMap的实现方式---锁桶(或段).ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶.试想,原来只能一个线程进入,现在却能同时16个写线程进入(写线程才需要锁定,而读线程几乎不受限制,之后会提到),并发性的提…