concurrenthashmap

ConcurrentHashMap crashing application compiled with JDK 8 but targeting JRE 7

回眸只為那壹抹淺笑 提交于 2019-11-29 12:37:43
问题 I ran into a very unexpected error today and while I was able to find a way to fix the problem as a whole I'm not sure I completely understand why it did what it did. The code I'm working with was originally written with a JDK 7 environment of course targeting JRE 7. In the code I was using a ConcurrentHashMap and needed to iterate over the keys in the map. For this I was using the map.keySet() which according to the JavaDocs should return a Set<K> . This worked fine until our build

Java回顾--集合

痴心易碎 提交于 2019-11-29 12:16:40
1、Collection接口和Collections包装类:    Collection概念: 是一个集合接口,提供了对集合对象进行基本操作的通用接口方法。   有以下结构:     |--List     |  |--LinkedList     |  |--ArrayList     |  |--Vector     |    |--stack     |--Set    Collections: 包含各种有关集合操作的静态多态方法,且该类无法实例化,相当于一个工具类。 2、HashMap、HashTable和ConcurrentHashMap:    HashMap的特点 :线程不安全,允许传入 null值,不能保存映射的顺序。由数组(默认长度为16)+链表组成,jdk1.8后,若其链表长度大于8,就会转变成红黑树。     ps:HashMap线程不安全,是因为多个对象同时对同一HashMap进行操作时,会导致脏读、数据丢失的发生。   详细参考:https://www.cnblogs.com/aspirant/p/8908399.html    HashTable: 可以理解为线程安全的HashMap,为什么是线程安全的,因为它的put、remove、get方法都被synchronized修饰,使其同步,自然是线程安全的了。    ConcurrentHashMap:

ConcurrentHashMap constructor parameters?

隐身守侯 提交于 2019-11-29 05:33:51
问题 I am wondering about the parameters for constructing a ConcurrentHashMap : initialCapacity is 16 by default (understood). loadFactor is 0.75 by default. concurrencyLevel is 16 by default. My questions are: What criteria should be used to adjust loadFactor up or down? How do we establish the number of concurrently updating threads? What criteria should be used to adjust concurrencyLevel up or down? Additionally: What are the hallmarks of a good hashcode implementation? (If an SO question

ConcurrentHashMap jdk 8 Uses TreeNodes instead of List .. Why? [closed]

五迷三道 提交于 2019-11-29 05:20:56
Hi i know the workings of ConcurrentHashMap before JDK 8. I also understood the code: it was pretty modular and not very hard to understand. The code of ConcurrentHashMap in JDK 8 has changed a lot from its previous implementations. Because this question was classified as too broad I will now try to be very specific. CHMv8 uses a TreeBin (a variant of RedBlackTree) for buckets rather than a linked list. So my question what is the main advantage of using TreeBin over a linked list? Source code here The main changes are to add ConcurrentHashMap specific implementations of the new Java 8 default

Hashmap如何实现线程安全

落爺英雄遲暮 提交于 2019-11-29 04:58:44
方法1:使用hashtable 方法2:使用java.util.concurrent.concurentHashMap 方法3:使用java.util.collections.synchronizedMap()方法包装 HashMap object,得到线程安全的Map,并在此Map上进行操作。 介绍HashTable: hashtable底层是数组+链表的形式,其中的get、put方法等都是用synchronized修饰的,因此,hashtable是线程安全的,但是执行效率比较低,一般不推荐使用。 介绍synchronizedMap synchronizedMap的线程安全和hashtable一样,都是使用sunchronized方法,将方法上锁。 介绍concurrentHashMap 上图为concurrentHahsMap结构图。 从图中可以看出,一个concurrentHashMap包含多个segment,而segment类似与hashTable,是线程安全的,因此concurrentHashMap是一个segment的数组,当有线程操作时,一个线程会操作一个segment,因此是多线程的同时也是安全的,有几个segment就允许几个线程同时操作。一般操作最先都是将key映射到对应的segment上。 不需要锁整个类,分段锁 来源: https://blog.csdn

ConcurrentHashMap原理浅析

落花浮王杯 提交于 2019-11-29 01:21:39
HashMap在高并发场景下存在的问题 具体信息可以查看下面这个帖子 https://blog.csdn.net/minkeyto/article/details/78667944 如果实在懒得看也没有关系,我们来简单回顾一下HashMap的结构: 简单来说,HashMap是一个Entry对象的数组。数组中的每一个Entry元素,又是一个链表的头节点。 Hashmap不是线程安全的。在高并发环境下做插入操作,有可能出现下面的环形链表: Segment 在高并发的情况下,一般会使用currentHashMap,ConcurrentHashMap对比HashMap主要是增加了Segment的概念。 Segment是什么呢?Segment本身就相当于一个HashMap对象。 同HashMap一样,Segment包含一个HashEntry数组,数组中的每一个HashEntry既是一个键值对,也是一个链表的头节点。 单一的Segment结构如下: 像这样的Segment对象,在ConcurrentHashMap集合中有多少个呢?有2的N次方个,共同保存在一个名为segments的数组当中。 因此整个ConcurrentHashMap的结构如下: 可以说,ConcurrentHashMap是一个二级哈希表。在一个总的哈希表下面,有若干个子哈希表。 这样的二级结构,和数据库的水平拆分有些相似。

HashMap与ConcurrentHashMap原理剖析

扶醉桌前 提交于 2019-11-29 01:17:07
HashMap与ConcurrentHashMap原理剖析 HashMap是基于 哈希表 的Map接口的实现。此实现提供所有可选的映射操作,并允许使用 null值 和null键。(除了不同步和允许使用null之外,HashMap类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。另外,HashMap是非 线程安全 的,也就是说在 多线程 的环境下,可能会存在问题,不像Hashtable是线程安全的。 ConcurrentHashMap结构与HashMap大致相同,为了实现线程安全,其比起HashMap的实现显得更加庞大。ConcurrentHashMap的数据结构和同步机制给自身提供了良好的多线程安全以及惊人的异步读取能力。 相信有经验的开发者都会注意到,在项目中总是会把两者混合使用;那么到底什么是线程安全呢?这可能是很多初学者带有的疑问,难道ConcurrentHashMap能保证多个线程的更新都保留吗?所谓的线程安全并不是那么厉害的东西,其实就是利用同步机制(锁)来保证其不会有多个Put操作同时作用。其实在这一点上Hashtable已经做到了,而ConcurrentHashMap可以比Hashtable限制更少从而更加高效。接下来从他们各自的原理来剖析。 HashMap原理 HashMap顾名思义,是由hash值来做映射的映射表<Key

ConcurrentHashMap源码详解

我怕爱的太早我们不能终老 提交于 2019-11-29 01:16:44
1. ConcurrentHashMap概述 ConcurrentHashMap是线程安全的哈希表,不同于HashTable,后者在方法上增加synchronized关键字,利用对象同步锁实现线程之间的同步。显然,HashTable实现线程安全的方式太“重”,并发度高的情况下,很多线程争用同一把锁,吞吐量较低。 ConcurrentHashMap通过锁分段技术,只有在同一个段内,才会存在锁竞争,提高了并发处理能力。它的内部数据结构其实是一个Segment数组,该数组的大小代表了ConcurrentHashMap的并发度,Segment同时也是一把可重入锁,该锁用来确保该段数据并发访问的线程安全。每一个Segment其实是一个类似于HashMap的哈希表,用来存储key-value。看下ConcurrentHashMap结构图: ConcurrentHashMap维护了一个Segment数组segments,每个Segment是一个哈希表。当线程需要访问segments[1]处的哈希表,首先需要获取该段的锁,然后才能访问该段的哈希表。上图中segments数组大小为8,因此并发度为8,最多支持8个线程在不同的段同时访问。 2. HashEntry HashEntry代表了哈希表的一个key-value项,它是ConcurrentHashMap的一个内部静态类

ConcurrentHashMap原理分析

自作多情 提交于 2019-11-29 01:15:59
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅。 在tiger之前,我们使用得最多的数据结构之一就是HashMap和Hashtable。大家都知道,HashMap中未进行同步考虑,而Hashtable则使用了synchronized,带来的直接影响就是可选择,我们可以在单线程时使用HashMap提高效率,而多线程时用Hashtable来保证安全。 当我们享受着jdk带来的便利时同样承受它带来的不幸恶果。通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,慧眼独具的Doug Lee立马拿出了解决方案----ConcurrentHashMap。 ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图 左边便是Hashtable的实现方式---锁整个hash表;而右边则是ConcurrentHashMap的实现方式--

ConcurrentHashMap(转载)

倖福魔咒の 提交于 2019-11-29 01:13:13
ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。在这之前我对ConcurrentHashMap只有一些肤浅的理解,仅知道它采用了多个锁,大概也足够了。但是在经过一次惨痛的面试经历之后,我觉得必须深入研究它的实现。面试中被问到读是否要加锁,因为读写会发生冲突,我说必须要加锁,我和面试官也因此发生了冲突,结果可想而知。还是闲话少说,通过仔细阅读源代码,现在总算理解ConcurrentHashMap实现机制了,其实现之精巧,令人叹服,与大家共享之。 实现原理 锁分离 (Lock Stripping) ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。 有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的