多线程-ConcurrentHashMap(JDK1.8)】的更多相关文章

前言 HashMap非线程安全的,HashTable是线程安全的,所有涉及到多线程操作的都加上了synchronized关键字来锁住整个table,这就意味着所有的线程都在竞争一把锁,在多线程的环境下,它是安全的,但是无疑效率低下的. ConcurrentHashMap(JDK1.7) 在JDK1.7中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成的,如图: Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,…
今天看到一篇博客:jdk1.8的HashMap和ConcurrentHashMap,我想起了前段时间面试的一个问题:ConcurrentHashMap(JDK1.8)为什么要使用synchronized而不是可重入锁? 我想从下面几个角度讨论这个问题: 锁的粒度 首先锁的粒度并没有变粗,甚至变得更细了.每当扩容一次,ConcurrentHashMap的并发度就扩大一倍. Hash冲突 JDK1.7中,ConcurrentHashMap从过二次hash的方式(Segment -> HashEntr…
1. Concurrent相关历史 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器(bins)时,吞吐量严重降低.因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了Java.util.concurrent包,在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点挺符…
hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能. ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表.对 与多线程的操作,介于 HashMap 与 Hashtable 之间.内部采用“锁分段”机制替代 Hashtable 的独占锁.进而提高性能. 此包还提供了设计用于多线程上下文中的 Collection 实现:Con…
参考: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…
并发与并行 并发 一个或多个处理器执行更多的任务(通过划分时间片来执行更多的任务),从逻辑上实现同时运行: 如,N个并发请求在一个两核CPU上: 并行 N个处理器分别同时执行N个任务,从物理上实现同时运行: 线程互斥 阻塞地加锁,通过ReentrantLock.lock()阻塞地加锁 阻塞地加锁的意义,在于在多线程环境下,同一时刻只有一个线程执行加锁代码,其他线程阻塞在加锁代码之前. ReentrantLock继承Lock,Lock接口提供了这些方法: ReentrantLock与synchro…
6.1 hash算法 就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 为了使得hash出来的值更加均衡,在concurrentHashMap里面使用了Wang/Jenkins hash算法再做了一次hash. 6.2 源码 6.2.1 构造方法 //DEFAULT…
1. Java Map 1. Java Map 重要观点 Java Map接口是Java Collections Framework的成员.但是它不是Collection 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.(不同的键对应的值可以相等) Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容. Map中某些映射实现可明确保证其自然顺序和定制顺序,如 TreeMap 类:另一些映射实现则不保证任何顺序,如 H…
一.简单回顾ConcurrentHashMap在jdk1.7中的设计 先简单看下ConcurrentHashMap类在jdk1.7中的设计,其基本结构如图所示: 每一个segment都是一个HashEntry<K,V>[] table, table中的每一个元素本质上都是一个HashEntry的单向队列.比如table[3]为首节点,table[3]->next为节点1,之后为节点2,依次类推. public class ConcurrentHashMap<K, V> ext…
一.简单回顾ConcurrentHashMap在jdk1.7中的设计 先简单看下ConcurrentHashMap类在jdk1.7中的设计,其基本结构如图所示: 每一个segment都是一个HashEntry<K,V>[] table, table中的每一个元素本质上都是一个HashEntry的单向队列.比如table[3]为首节点,table[3]->next为节点1,之后为节点2,依次类推. public class ConcurrentHashMap<K, V> ext…