[简述] ConcurrentHashMap内部使用段(Segment)来表示这些不用的部分,每个段其实就是一个小的HashTable,他们有自己的锁,只要多个修改操作发生在不同的段上,他们就可以并发执行.把一个整体的分成了16个段(Segment),也就是最高支持16个线程并发的修改操作.这也是在多线程场景时减少锁的粒度从而减低锁竞争的一种方案. 其代码中大多数变量都使用volatile关键字声明,目的是第一时间获取修改的内容,性能非常好. ConcurrentSkipListMap支持并发排…
一.前言 最近在做项目的同时也在修复之前项目的一些Bug,所以忙得没有时间看源代码,今天都完成得差不多了,所以又开始源码分析之路,也着笔记录下ConcurrentSkipListMap的源码的分析过程. 二.ConcurrentSkipListMap数据结构 抓住了数据结构,对于理解整个ConcurrentSkipListMap有很重要的作用,其实,通过源码可知其数据结构如下. 说明:可以看到ConcurrentSkipListMap的数据结构使用的是跳表,每一个HeadIndex.Index结…
概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSkipListMap原理和数据结构ConcurrentSkipListMap函数列表ConcurrentSkipListMap源码分析(JDK1.7.0_40版本)ConcurrentSkipListMap示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/…
Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSkipListMap 的4倍左右. 但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点: 1.ConcurrentSkipListMap 的key是有序的. 2.Concurrent…
比较Java原生的 3种Map的效率. 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 结果: 模拟150W以内海量数据的插入和查找,通过增加和查找两方面的性能测试,结果如下: Map类型 插入 查找(在100W数据量中)   10W 50W 100W 150W 0-1W 0-25W 0-50W Concurrent SkipListMap 62 ms 227 ms 433 ms 689ms 7 ms 80 ms 119 ms HashMap…
一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSkipListMap 的4倍左右. 但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点: 1.ConcurrentSkipListMap 的key是有序的. 2.ConcurrentSkipListMap 支持更高的并发.ConcurrentSkipLi…
问题 比較Java原生的 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 3种Map的效率. 结果 模拟150W以内海量数据的插入和查找,通过添加和查找双方面的性能測试,结果例如以下: Map类型 插入 查找(在100W数据量中)   10W 50W 100W 150W 0-1W 0-25W 0-50W ConcurrentSkipListMap 62 ms 227 ms 433 ms 689ms 7 ms 80 ms 119 ms HashM…
1.前言 ConcurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSkipListMap 的4倍左右.但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点: ConcurrentSkipListMap 的key是有序的. ConcurrentSkipListMap 支持更高的并发.ConcurrentSkipListMap…
我们知道 HashMap 是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序.由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容器.当然,jdk 中也为我们提供了基于红黑树的存储的 TreeMap 容器,它的内部元素是有序的,但是由于它内部通过红黑结点的各种变换来维持二叉搜索树的平衡,相对复杂,并且在并发环境下碍于 rebalance 操作,性能会受到一定的影响. 跳表(SkipList)是一种随机化的数据结构,通过"空间来…
一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSkipListMap 的4倍左右. 但ConcurrentSkipListMap有几个ConcurrentHashMap 不能比拟的优点: 1.ConcurrentSkipListMap 的key是有序的. 2.ConcurrentSkipListMap 支持更高的并发.ConcurrentSkipLi…
一.前言 JCIP 提到了在 Java 6 中引入了两个新的并发集合类 ConcurrentSkipListMap 和 ConcurrentSkipListSet.其实只要介绍一下 ConcurrentSkipListMap 即可(后面简称为 CSLM),因为我们都知道 JDK 中 Set 是基于 Map 实现的.简而言之,CSLM 是一个并发的.可排序的 Map,因此它可以在多线程环境中弥补 ConcurrentHashMap 不支持排序的功能不足.从名字上就可以看出 CSLM 是基于 Ski…
前情提要 点击链接查看"跳表"详细介绍. 拜托,面试别再问我跳表了! 简介 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表. 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找. 跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能. 存储结构 跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找. 源码分析 主要内部类 内部类跟存储结构结合着来看,大概能预测到代码的组织方式. // 数据节点,典型的单链表结构 static final…
一.ConcurrentSkipListMap并发容器 1.ConcurrentSkipListMap的底层数据结构     要学习ConcurrentSkipListMap,首先要知道什么是跳表或跳跃表(SkipList),跳表链表的升级版,且是有序的,另外跳表还是一种不论查找.添加或是删除效率可以和平衡二叉树媲美的层次结构(其时间复杂度是O(n)=log2n),更重要的是,跳表的实现要简单明了的多.     上图就是一个跳表的层次结构图,跳表的特征有:     1.跳表分为若干层,层级越高跳…
一.ConcurrentSkipListMap介绍 ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景.ConcurrentSkipListMap和TreeMap,它们虽然都是有序的哈希表.但是,第一,它们的线程安全机制不同,TreeMap是非线程安全的,而ConcurrentSkipListMap是线程安全的.第二,ConcurrentSkipListMap是通过跳表实现的,而TreeMap是通过红黑树实现的. 在4线程1.6万数据的条件下,Concurre…
比较Java原生的 3种Map的效率. 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 模拟150W以内海量数据的插入和查找,通过增加和查找两方面的性能测试,结果如下: Map类型 插入 查找(在100W数据量中)   10W 50W 100W 150W 0-1W 0-25W 0-50W Concurrent SkipListMap 62 ms 227 ms 433 ms 689ms 7 ms 80 ms 119 ms HashMap  18…
一:ConcurrentSkipListMap TreeMap使用红黑树按照key的顺序(自然顺序.自定义顺序)来使得键值对有序存储,但是只能在单线程下安全使用:多线程下想要使键值对按照key的顺序来存储,则需要使用ConcurrentSkipListMap. ConcurrentSkipListMap的底层是通过跳表来实现的.跳表是一个链表,但是通过使用“跳跃式”查找的方式使得插入.读取数据时复杂度变成了O(logn). 跳表(SkipList):使用“空间换时间”的算法,令链表的每个结点不仅…
ConcurrentSkipListMap介绍 ConcurrentSkipListMap是线程安全的有序的哈希表,适用于高并发的场景. ConcurrentSkipListMap和TreeMap,它们虽然都是有序的哈希表.但是,第一,它们的线程安全机制不同,TreeMap是非线程安全的,而ConcurrentSkipListMap是线程安全的.第二,ConcurrentSkipListMap是通过跳表实现的,而TreeMap是通过红黑树实现的. 关于跳表(Skip List),它是平衡树的一种…
转载请注明源出处:http://www.cnblogs.com/lighten/p/7542578.html 1.前言 一个可伸缩的并发实现,这个map实现了排序功能,默认使用的是对象自身的compareTo方法,如果提供了比较器,使用比较器的比较方法.简单来说ConcurrentSkipListMap是TreeMap的并发实现,但是为什么没有称之为ConcurrentTreeMap呢?这和其自身的实现有关.该类是SkipLists的变种实现,提供了log(n)的时间开销:containsKey…
简介 基于跳表,支持并发,有序的哈希表. 跳表 红色路径为寻找结点F. 拿空间换时间,时间复杂度,O(nlogn). 源码分析 内部类 Node 属性 final K key; // 键 volatile Object value; // 值 volatile Node<K,V> next; // 指向下一个结点 最底层是基础层,即使结点(Node)层,保存实际数据(value),next指向下一个结点 构造方法 Node(K key, Object value, Node<K,V>…
比较Java原生的 3种Map的效率. 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 结果: 模拟150W以内海量数据的插入和查找,通过增加和查找两方面的性能测试,结果如下: Map类型 插入 查找(在100W数据量中)   10W 50W 100W 150W 0-1W 0-25W 0-50W Concurrent SkipListMap 62 ms 227 ms 433 ms 689ms 7 ms 80 ms 119 ms HashMap …
ConcurrentSkipListMap提供了一种线程安全的并发访问的排序映射表.内部是SkipList(跳表)结构实现,在理论上能够在O(log(n))时间内完成查找.插入.删除操作. 理解SkipList 要想弄明白ConcurrentSkipListMap,我们的先明白他的数据结构实现,先来看SkipList. Skip List是一种随机化的数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间).基本上,跳跃列表是对有序的链表增加上附加的前进链…
二分查找和AVL树查找 二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存.这样查找确实很快,但是插入和删除元素的时候,为了保证元素的有序性,就需要大量的移动元素了. 如果需要的是一个能够进行二分查找,又能快速添加和删除元素的数据结构,首先就是二叉查找树,二叉查找树在最坏情况下可能变成一个链表. 于是,就出现了平衡二叉树,根据平衡算法的不同有AVL树,B-Tree,B+Tree,红黑树等,但是AVL树实现起来比较复杂,平衡操作较难理解,这时候就可以用SkipList跳跃表结构. 什…
package com.geo.map;  import java.util.Iterator;import java.util.Map.Entry;import java.util.Set;import java.util.concurrent.ConcurrentNavigableMap;import java.util.concurrent.ConcurrentSkipListMap;  public class ConcurrentSkipListMapTest {        pub…
ConcurrentHashMap 内部结构 在JDK1.8之前的实现结构是:ReentrantLock+Segment+HashEntry+链表 JDK1.8之后的实现结构是:synchronized+CAS+Node+链表或红黑树(与HashMap一致) 而1.8之前锁的是Segment,1.8锁的是Node数组里的Node,准确来说是头结点.如图虚线所示: 为什么要废弃锁分段机制: 1. 分段造成内存浪费(内存不连续,碎片化) 2. 在添加时竞争同一个锁的概率非常小,分段锁反而会造成更新等…
引言 上一篇Java同步数据结构之Map概述及ConcurrentSkipListMap原理已经将ConcurrentSkipListMap的原理大致搞清楚了,它是一种有序的能够实现高效插入,删除,更新,搜索的基于链表结构的无锁线程安全Map,它是SkipList(跳表)的一种变体实现(其节点同时存储了key和Value键值对),即是以空间换时间的方式随机的将基层链表上的某些节点抽出来构成多层索引链表,从而可以通过索引链表快速的定位到基层链表的目标节点.新的索引链表会随着其索引节点的第一次加入而…
原文出处http://cmsblogs.com/ 『chenssy』 到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash.TreeMap,这两种数据结构各自都有着优缺点. Hash表:插入.查找最快,为O(1):如使用链表实现则可实现无锁:数据有序化需要显式的排序操作. 红黑树:插入.查找为O(logn),但常数项较小:无锁实现的复杂性很高,一般需要加锁:数据天然有序. 然而,这次介绍第三种实现key-value的数据结构:SkipList.SkipList有着…
引言 前面介绍了CopyOnWriteArraySet,本来接着是打算介绍ConcurrentSkipListSet,无耐ConcurrentSkipListSet的内部实现其实是依赖一个ConcurrentSkipListMap实例实现的,所以必须先理解ConcurrentSkipListMap,因此我们不得不进入到Map家族. Map概述 上图画出了Java并发包中关于Map的类结构图(Note: 绿色表示接口,蓝色表示实例类,黄色表示抽象类),并发包中只有4个与Map相关的类,其中两个接口…
转自:http://cmsblogs.com/?p=4773 [隐藏目录] 前情提要 简介 存储结构 源码分析 主要内部类 构造方法 添加元素 添加元素举例 删除元素 删除元素举例 查找元素 查找元素举例 彩蛋 作者:彤哥 出处:https://www.cnblogs.com/tong-yuan/ 前情提要 点击链接查看“跳表”详细介绍. 拜托,面试别再问我跳表了! 简介 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表. 跳表在原有的有序链表上面增加了多级索引,通过索引来实现…
ConcurrentSkipListMap ConcurrentSkipListMap 能解决什么问题?什么时候使用 ConcurrentSkipListMap? 1)ConcurrentSkipListMap 是基于跳表实现的并发排序哈希表,映射可以根据键的自然顺序进行排序, 也可以根据创建映射时所提供的 Comparator 进行排序,具体取决于使用的构造方法. 2)ConcurrentSkipListMap 的 containsKey.get.put.remove 操作及其变体提供预期平均…
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11444013.html 并发场景下的Map容器使用场景 如果对数据有强一致要求,则需使用Hashtable: 在大部分场景通常都是弱一致性的情况下,使用ConcurrentHashMap即可: 如果数据量在千万级别,且存在大量增删改操作,则可以考虑使用ConcurrentSkipListMap. ConcurrentHashMap ConcurrentHashMap在保证线程安全的基础上兼具了更好的…