- HashMap 和 HashTable 有什么区别?
- java中的另一个线程安全的与HashMap极其类似的类是什么?同样是线程安全,它与HashTable在线程同步上有什么不同?
- HashMap 与 ConcurrentHashMap的区别?
- 为什么 ConcurrentHashMap 比 HashTable效率高?
- 针对 ConcurrentHashMap 锁机制具体分析(JDK1.7 vs JDK1.8)?
- ConcurrentHashMap 在1.8中,为什么要使用内置锁 synchronized 来代替重入锁 ReetrantLock?
- ConcurrentHashMap 简单介绍?
- ConcurrentHashMap 的并发度是多少?
1. 答:(1)HashMap 是线程不安全的,HashTable 是线程安全的。
(2)由于线程安全,所以HashTable 效率比不上 HashMap。
(3)HashMap 最多只允许一条记录的键为null,允许多条记录的值为null,而HashTable不允许。
(4)HashMap 的默许初始化数组的大小是16,HashTable 是11,前者扩容时扩大两倍,后者扩大两倍+1;
(5)HashMap 需要重新计算hash值,而HashTable 直接使用对象的hashCode.
2. 答:ConcurrentHashMap类。HashTable 是使用synchronized关键字加锁的原理(就是对对象加锁);而针对ConcurrentHashMap,在JDK1.7中采用分段锁的方式,在JDK1.8中直接采用了CAS(无锁算法)+synchronized,也采用分段锁的方式并大大缩小了锁的粒度。
3. 答:除了加锁,原理上没有太大的区别。另外,HashMap 的键值允许为null,但是ConcurrentHashMap 都不允许。
4. 答:HashTable使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞。ConcurrentHashMap在1.7中使用分段锁(ReentrantLock + segment + HashEntry),相当于把一个HashMap分成多个段,每段都分一把锁,这样支持多线程访问。锁粒度:基于segment,包含多个HashEntry。在1.8中使用CAS+synchronized+Node+红黑树。锁力度:Node。锁力度降低了。
5. 答:
6. 答:
7. 答:
8. 答: