一文教会你HashMap为啥线程不安全(多图VIP版)

HashMap在多线程环境下由于非原子性的“增删改”操作导致线程不安全,主要表现为死循环和丢失更新。JDK7中因头插法在扩容时产生环形链表,而JDK8虽然改用尾插法,但问题依然存在。HashMap设计用于单线程,多线程场景推荐使用ConcurrentHashMap。
摘要由CSDN通过智能技术生成

首先思考一下,为啥 HashMap 会存在线程安全性问题?

有的人脱口而出,JDK7 的 HashMap 因为采用头插法,多线程环境下会造成死循环,JDK8 虽然改用了尾插法,但多线程环境下仍然存在丢失更新的问题,所以 HashMap 存在线程安全性问题。

一听就是老八股人了,哈哈哈。

但其实上面的答案并不全面,而且很容易误导编程的新手,让新手总以为 HashMap 只是因为死循环或者丢失更新的问题才导致的线程不安全。

HashMap 之所以存在线程安全性问题,本质上是因为 HashMap 的"增删改"操作均是多步操作的集合,或者说是非原子的。

在多线程环境下,非原子的操作可能因为线程调度的问题,引发各种线程不安全性问题。以 put() 方法为例:

public V put(K key, V value) {
	if (table == EMPTY_TABLE) {
		inflateTable(threshold);
	}
	if (key == null)
		return putForNullKey(value);
	int hash = hash(key);
	int i = indexFor(hash, table.length);
	for (Entry<K,V> e = table[i]; e != null; e = e.next) {
		Objec
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值