HashTable和ConcurrentHashMap的区别
HashTable
HashTable是线程安全的,对关键方法都提供了sunchronized, 相当于针对this加锁.
这里也会出现一些问题?
当我们去任意的针对对象进行操作,都会涉及到对this的加锁.此时此刻,有很多线程
都想操作对象,就一定会出发激烈的锁竞争,最后只能排队一个一个执行,并发效率非常低效.
ConcurrentHashMap
对于HashTable,当两个key通过hash函数映射到同一个数组下标时,就会出现hash冲突.
所以我们在数组下标后面增加一个链表,来存储值,数据更多的话就又连接上红黑树了.
数组-> 链表 -> 红黑树
对于ConcurrentHashMap,有两个修改操作,是针对两个不同的链表进行修改, 此时是没有
线程安全问题的!
但是如果是针对同一个链表进行修改,可能会出现线程安全问题.此时ConcurrentHashMap
就把每个链表都加上了一把锁,此时就可以用链表头结点作为锁对象.
ConcurrentHashMap改进
- 减小了锁的粒度,每个链表有一把锁,大部分情况下都不会涉及到锁冲突.
- 广泛使用了CAS操作,针对两个线程的size++操作也不会有锁冲突.
- 写操作进行了加锁, 多操作没有加锁.
- 针对扩容操作进行了渐进式优化:
- HashTable触发扩容,就会一口气完成所有元素的搬运,这个过程非常耗时.
- ConcurrentHashMap会创建出一个更大的数组, 逐渐的把旧数据往新数组上搬运,可能会有一段时间旧数组和新数组同时存在.
当进行新增元素时,会把新元素往新数组上插入.
进行删除元素时,把旧数组的元素删除即可.
进行查找元素时,对新旧数组都进行查找.
进行修改元素时,统一在新数组上修改.
小结
对于HashMap和ConcurrentHashMap的区别, 主要是线程不安全和线程安全的区别…
上述比克详细总结了HashMap和ConcurrentHashMap的区别, 希望有收获的小伙伴动动手指,
多多支持.