concurrenthashmap

ConcurrentHashMap源码详解(与HashMap/HashTable的比较)

前提是你 提交于 2020-01-19 09:33:00
先看看速度比HashTable快又比HashMap线程安全的------当红明星ConcurrentHashMap具体使用方法: 非常的平淡无奇,跟HashMap和HashTable好像是一样东西。 但是,ConcurrentHashMap其实是融合了HashMap/HashTable这两种Hash表数据结构的优点。我们看源码可以知道: HashTable全部操作方法都是用Java 中自带的synchronized锁强制做同步达到线程安全的,不管是get还是put还是其他一些方法。 而HashMap就没考虑那么多,它的方法中全部没做线程安全锁处理。具体详细的HashMap介绍请看另外一篇博文: https://blog.csdn.net/whiteBearClimb/article/details/103946465 因此我们可以得出结论就是HashMap速度快但是线程不安全;HashTable速度慢但是线程安全。 ConcurrentHashMap就是融合它们二者各自的优点。既是线程安全的,速度又相对能较快。那么是怎么实现的呢?看源码: 继续进去ConcurrentMap看看什么个东西 这些毫无疑问没啥好讲的,我们再看看它最常用的几个方法有什么不同点。 Get方法: Put方法: 这里如果有仔细看过HashMap代码的人瞬间就恍然大悟了,没看过的打开:::https://blog

ConcurrentHashMap 详解

故事扮演 提交于 2020-01-18 23:55:21
一、 JDK7下的 CurrentHashMap 在JDK1.7版本中,ConcurrentHashMap的数据结构是由一个Segment数组和多个HashEntry组成,主要实现原理是实现了锁分离的思路解决了多线程的安全问题。Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是 HashEntry数组+链表,这个和HashMap的数据存储结构一样。 如下图所示: ConcurrentHashMap 与HashMap和Hashtable 最大的不同在于:put和 get 两次Hash到达指定的HashEntry,第一次hash到达Segment,第二次到达Segment里面的Entry, 然后在遍历entry链表. ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁。 1. 初始化 ConcurrentHashMap的初始化是会通过位运算来初始化Segment的大小,用ssize来表示,源码如下所示: private static final int DEFAULT_CONCURRENCY_LEVEL = 16; private void writeObject(java.io.ObjectOutputStream s) throws java.io

并发读写缓存实现机制:高并发下数据写入与过期

∥☆過路亽.° 提交于 2020-01-15 23:46:07
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt207 一般来说并发的读取和写入是一对矛盾体,而缓存的过期移除和持久化则是另一对矛盾体。这一节,我们着重来了解下高并发情况下缓存的写入、过期控制及周边相关功能。系列文章目录:并发读写缓存实现机制(零):缓存操作指南并发读写缓存实现机制(一):为什么ConcurrentHashMap可以这么快?并发读写缓存实现机制(二):高并发下数据写入与过期并发读写缓存实现机制(三):API封装和简化 1.高效的数据写入(put) 在研究写入机制之前,我们先来回顾下上一节的内容。ConcurrentHashMap之所以读取很快,很大一部分原因归功于它的数据分割设计,就像是把书的内容划分为很多章,章下面又分了许多小节。同样的原理,写入过程也可以按这个规则把数据分为很多独立的块,也就是前一节提到的Segment。另一方面为了解决并发问题,加锁是一个不错的选择。再回头看看Segment类图(清单1),Segment其实是继承了ReentrantLock,自己本身就是一个锁。清单1:Segment类图想要最大限度的支持并发,就是读写操作都不加锁,JDK8 就实现了无锁的并发HashMap,效率更高的同时复杂度也更大;而在锁机制中,一个很好的方法就是读操作不加锁,写操作加锁

ConcurrentHashMap

只谈情不闲聊 提交于 2020-01-15 15:21:13
一、为什么要用ConcurrentHashMap 经典讲解为什么并发不用HashMap: https://blog.csdn.net/mydreamongo/article/details/8960667 你需要拥有的前置知识–HashMap源码解析: https://blog.csdn.net/yanluandai1985/article/details/79387533 HsahMap 在并发执行put操作时会引起死循环,是因为多个线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会死循环获取Entry。 Hashtable 容器使用的是synchronized来保证线程安全,但是Hashtable性能低下。原因是当一个线程访问Hashtable的同步方法的时候,另外的线程只能进入阻塞状态,等待那个拥有同步锁的线程释放同步锁。所以线程竞争同步锁越激烈,Hashtable的性能越低下。综上, Hashtable性能低下的原因是所有线程竞争同一把锁。 ConccurentHashMap 为了改善多个线程竞争同一把锁导致的性能低下的缺点,ConccurentHashMap采用的是锁分段技术。锁分段技术的原理是:当操作互不影响,锁就可以分离。 ConcurrentHashMap把这个容器分为若干段,每段分配一把锁

Thread safe Map of Queues

不羁岁月 提交于 2020-01-15 12:24:28
问题 I want to implement a thread safe Map of Queues. I intent to start with an empty Map. If the key does not exist, I want to create a new Map entry with a new Queue. If the key does exist, I want to add to the Queue. My proposed implementation is as follows: import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public class StackOverFlowExample { private final Map<String, ConcurrentLinkedQueue<String>> map = new ConcurrentHashMap

ConcurrentHashMap原理解析

僤鯓⒐⒋嵵緔 提交于 2020-01-14 15:45:13
概述 ConcurrentHashMap是JDK提供的一个线程安全的集合类,它内部的结构原理和我们常用的HashMap基本是一致,那我们可以先来认识一下HashMap,这样基本上也能大致明白ConcurrentHashMap了。 数据结构 HashMap与ConcurrentHashMap都是用来存放一种键值对形式的数据,那它们内部的数据结构是怎么样的呢? 首先来看看HashMap的put方法 public V put(K key, V value) { // put方法中首先对key进行hash运算,再调用putVal return putVal(hash(key), key, value, false, true); } final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null

How to implement ConcurrentHashMap with features similar in LinkedHashMap?

放肆的年华 提交于 2020-01-11 23:01:13
问题 I have used LinkedHashMap with accessOrder true along with allowing a maximum of 500 entries at any time as the LRU cache for data. But due to scalability issues I want to move on to some thread-safe alternative. ConcurrentHashMap seems good in that regard, but lacks the features of accessOrder and removeEldestEntry(Map.Entry e) found in LinkedHashMap . Can anyone point to some link or help me to ease the implementation. 回答1: I did something similar recently with ConcurrentHashMap<String

一文聊聊ConcurrentHashMap

孤人 提交于 2020-01-10 04:03:15
1.ConcurrentHashmap简介 在使用 HashMap 时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的 hashtable 类,该类基本上所有的方法都采用synchronized进行线程安全的控制,可想而知,在高并发的情况下,每次只有一个线程能够获取对象监视器锁,这样的并发性能的确不令人满意。另外一种方式 通过Collections的Map<K,V> synchronizedMap(Map<K,V> m)将hashmap包装成一个线程安全的map 。比如SynchronzedMap的put方法源码为: public V put(K key, V value) { synchronized (mutex) {return m.put(key, value);} } 实际上 SynchronizedMap实现依然是采用synchronized独占式锁进行线程安全的并发控制的 。同样,这种方案的性能也是令人不太满意的。针对这种境况,Doug Lea大师不遗余力的为我们创造了一些线程安全的并发容器,让每一个java开发人员倍感幸福。 相对于hashmap来说,ConcurrentHashMap就是线程安全的map,其中利用了锁分段的思想提高了并发度 。 ConcurrentHashMap在JDK1

面试(二)

陌路散爱 提交于 2020-01-09 18:51:32
4.介绍一下java的数据结构,然后手写一个栈的类 主要可以分为两类: 1)Java中定义了一个接口collection,用来存储一个元素集合 2)另一种是定义了映射(map)用来存储键/值对。 Collection接口为线性表(list)、向量(vector)、栈(stack)、队列(queue)、优先队列(priority queue)以及规则集(set)定义了通用的操作 Set(规则集) 用于存储一组不重复的元素。 重要的实现类: HashSet 。 List(线性表) 用于存储一个有序元素的集合(允许重复)。两个重要的实现类: ArrayList (数组线性表类)和 LinkedList (链表类)。 Stack(栈) 用于存储采用后进先出方式处理的对象。 Queue(队列) 用于采用先进先出方式处理的对象。不过队列用双向链表 LinkedList 实现更好 PriorityQueue用于存储按照优先级顺序处理的对象。 map(映射)是一个存储“键/值对”集合的容器对象。键很像索引,在List中,索引是整数;在Map中,键可以是任意类型的对象。映射中不能有重复的键,每个键都对于一个值。 线性表、栈、队列、优先队列: ArrayList、LinkedList 都是线程不安全的 。 vector是线程安全的。 ArrayList :用数组存储元素。这个数组是动态创建的

new ConcurrentHashMap of new ConcurrentHashMap

孤街醉人 提交于 2020-01-06 12:42:13
问题 I'm trying to initialize a ConcurrentHashMap of ConcurrentHashMap s with private final ConcurrentHashMap< String, ConcurrentHashMap<String, Double> > myMulitiConcurrentHashMap = new ConcurrentHashMap< String, new ConcurrentHashMap<String, Double>() >(); but javac gives HashMapper.java:132: error: illegal start of type new ConcurrentHashMap<String, Double>() ^ HashMapper.java:132: error: '(' or '[' expected new ConcurrentHashMap<String, Double>() ^ HashMapper.java:132: error: ';' expected new