HashTable,HashMap和ConcurrentHashMap的区别

目录

1.三者的区别

2.ConcurrentHashMap的优化策略

3.总结


1.三者的区别

HashMap是线程不安全的,在多线程中不适合使用,key允许为null

HashTable和ConcurrentHashMap是线程安全的,其中HashTable在多线程中不推荐使用,而后者则是多线程使用哈希表的最优解,这两者key不允许为null

原因:HashTable在关键方法中给自身的对象加了一把大锁,如图:

HashTable,HashMap和ConcurrentHashMap的区别_第1张图片

 带来的缺点在于:1.在多个线程修改变量中会发生锁冲突,即使不在一个哈希桶里

2.扩容的速度十分慢

3.size属性同步时也会发生锁冲突,造成效率慢

而ConcurrentHashMap的锁策略在于为每一个哈希桶都分配一把锁(在哈希桶的头结点),这样就只有多线程在同一个哈希桶内进行修改时会发生锁冲突,因为链表结构前后数据会有关联.,所以锁冲突大大降低了

HashTable,HashMap和ConcurrentHashMap的区别_第2张图片

 

2.ConcurrentHashMap的优化策略

**1.把锁的粒度进行细分了,每个哈希桶都有一把自己的锁(每个链表的头结点),降低了锁冲突的概率

2.读的时候不会加锁,写的时候才会加锁,有点像synchronized偏向锁的时候,为了保证能读到刚修改的数据,会使用volatile关键字修饰

3.扩容不会一次性对所有的元素进行重新哈希,put方法会每次都对一部分元素进行重新哈希,化整为零,查询的时候新表旧表一起查,新增元素时会往新表上增加(但是元素个数会累加,哈希表的总长不变),直到所有元素搬运完,就完成了整个扩容

3.总结

1.HashMap线程不安全的.HashTable和ConcurrentHashMap是线程安全的!!
2.HashTable是使用一把大锁锁冲突概率很高.

ConcurrentHashMap则是每个哈希桶一把锁,锁冲突概率大大降低了

3.ConcurrentHashMap 其他的优化策略
4.HashMap 的key 允许为null另外两个的key值不允许为null

你可能感兴趣的:(线程,java,哈希算法,开发语言)