答:ConcurrentHashMap里使用了Segment分段锁+HashEntry,而HashTable用的是Syncronized锁全部,所有线程竞争一把锁。 Segment分段锁继承ReentrantLock,在并发数高的时候,ReentrantLock比Syncronized总体开销要小一些。
为了高效ConcurrentHashMap不会对整个容器进行扩容,而只对某个segment进行扩容。 get操作不需要锁 除非读到的值是空的才会加锁重读,我们知道HashTable容器的get方法是需要加锁的,那么ConcurrentHashMap的get操作是如何做到不加锁的呢?原因是它的get方法里将要使用的共享变量都定义成volatile。 size()操作 如果我们要统...
ConcurrentHashMap 类(是 Java并发包 java.util.concurrent 中提供的一个线程安全且高效的 HashMap 实现)。 HashTable 是使用 synchronize 关键字加锁的原理(就是对对象加锁); 而针对 ConcurrentHashMap,在 JDK 1.7 中采用 分段锁的方式;JDK 1.8 中直接采用了CAS(无锁算法)+ synchronized。 16.HashMap & Concu...
ConcurrentHashMap 底层采用分段的数组+链表实现,线程安全 通过把整个Map分为N个Segment(可重入锁),可以提供相同的线程安全,但是效率提升N倍,默认提升26倍。(读操作不加锁,由于HashEntry的value变量是volatile的,也能保证读取到最新的值。) Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,Conc...
在JDK7时候ConcurrentHashMap底层是采用:由Segment数组结构和HashEntry数组结构组成实现的 实现思路:首先将数据分成一段一段地存 储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数 据也能被其他线程访问。Segment继承了ReentrantLock,每个片段都有了一个锁,叫做“锁分段”。
HashTable使用一把锁处理并发问题,当有多个线程访问时,需要多个线程竞争一把锁,导致阻塞ConcurrentHashMap则使用分段,相当于减少了锁的粒度,举个例子,当我向集合中增加元素的时候,通过计算hash值取余等操作,确定在数组中的位置,之后我们只对当前这个位置的结点进行上锁,只要其他线程增加的元素不是散列到这个位置,都可以...
【Java面试】面试被问:ConcurrentHashMap 底层实现原理?高手的回答堪称完美 06:02 【Java面试】太卷了?!面试业务开发,被问: 什么叫阻塞队列的有界和无界? 03:10 【Java面试】数据结构面试必问题,HashMap如何解决哈希冲突? 04:33 【Java面试】面试被问:线程池如何知道一个线程的任务已经执行完成? 04:13 【...
【Java面试】面试被问:ConcurrentHashMap 底层实现原理?高手的回答堪称完美 06:02 【Java面试】太卷了?!面试业务开发,被问: 什么叫阻塞队列的有界和无界? 03:10 【Java面试】数据结构面试必问题,HashMap如何解决哈希冲突? 04:33 【Java面试】面试被问:线程池如何知道一个线程的任务已经执行完成? 04:13 【...
或者直接用 JDK 后来推出的 ConcurrentHashMap,后者就更牛逼了,它玩的是分段锁,跟 HashTable 的...
HashMap 是非 synchronized,所以 HashMap 很快 HashMap 可以接受 null 键和值,而 Hashtable 则不能(原因就是 equlas() 方法需要对象,因为 HashMap 是后出的 API 经过处理才可以) 二. HashMap 的工作原理是什么? HashMap 是基于 hashing 的原理 我们使用 put(key, value) 存储对象到 HashMap 中,使用 get(...