并发下map的常见面试题

并发下map的常见面试题:

hashMap和hashTable有什么区别?

1、HashMap是非线程安全的,HashTable是线程安全的。
2、HashMap的键和值都允许有null值存在,而HashTable则不行。
3、因为线程安全的问题,HashMap效率比HashTable的要高。
4、Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。

java中另一个线程安全的与hashMap极其类似的类是什么?同样是线程安全,它与hashTable在线程同步上有什么不同?

是ConcurrentHashMap。
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。
Hashtable的实现方式是锁整个hash表;而ConcurrentHashMap的实现方式是锁桶(或段ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。试想,原来只能一个线程进入,现在却能同时16个写线程进入(写线程才需要锁定,而读线程几乎不受限制,之后会提到),并发性的提升是显而易见的。
ConcurrentHashMap1.8锁的粒度更细了,锁的是链表的首节点

hashMap和concurrenthashmap的区别

hashmap线程不安全,concurrentHashMap是线程安全的

在1.7采取的segment分段锁,有点类似于16个线程安全的hashtable组合成了一个concurrenthashmap,不同分段操作不需要上锁,同一个分段才需要上锁,读不上锁,写上锁。锁的粒度更加精细。1.8锁的粒度更细了,锁的是链表的首节点

为什么concurrenthashmap比hashTable效率要高?

在1.7采取的segment分段锁,有点类似于16个线程安全的hashtable组合成了一个concurrenthashmap,不同分段操作不需要上锁,同一个分段才需要上锁,读不上锁,写上锁。锁的粒度更加精细。1.8锁的粒度更细了,锁的是链表的首节点

concurrenthashmap锁机制具体分析(1.7 vs 1.8)
image.png

image.png

1.7中是segment数组+hashEntry数组+链表,1.8中是Node数组+链表+红黑树
1.JDK1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点)
2.JDK1.8使用红黑树来优化链表,基于长度很长的链表的遍历是一个很漫长的过程,而红黑树的遍历效率是很快的,代替一定阈值的链表,这样形成一个最佳拍档
3.JDK1.8使用内置锁synchronized来代替重入锁ReentrantLock

concurrenthashmap在jdk1.8中,为什么要使用内置锁syncronized来代替重入锁reentrantlock?

1.JVM的开发团队从来都没有放弃synchronized,而且基于JVM的synchronized优化空间更大,使用内嵌的关键字比使用API更加自然
2.在大量的数据操作下,对于JVM的内存压力,基于API的ReentrantLock会开销更多的内存,虽然不是瓶颈,但是也是一个选择依据

1.8concurrenthashmap简单介绍
concurrenthashmap的并发度是什么?

1.7中ConcurrentHashMap的并发度就是segment的大小,默认为16,这意味着最多同时可以有16条线程操作ConcurrentHashMap

你可能感兴趣的:(并发下map的常见面试题)