hashmap为什么线程不安全
这是《Java程序员进阶之路》专栏的第58篇,我们来聊聊为什么HashMap是线程不安全的。0多线程下扩容会死循环众所周知,HashMap是通过拉链法来解决哈希冲突的,也就是当哈希冲突时,会将相同哈希值的键值对通过链表的形式存放起来。
在JDK7的多线程环境中,HashMap容易出现死循环,因此被认为是线程不安全的。HashMap是基于哈希表的Map接口实现,提供所有可选的映射操作,并允许使用null值和null键。该实现假定哈希函数能够将元素适当地分布在各个桶之间,从而为基本的get和put操作提供稳定的性能。
hashmap在jdk7多线程环境下HashMap容易出现死循环所以线程不安全。hashmap是基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get和put)提供稳定的性能。
在JDK7及之前的版本中,多线程环境下的HashMap扩容时,会出现死循环和数据丢失的问题。此现象在JDK8版本中同样存在,但在更后期版本中得到了部分改善。以JDK8为例,HashMap中多个键值对可能被分配至同一桶,并通过链表或红黑树形式存储。
迭代过程中的修改:HashMap的迭代过程是基于failfast机制的。如果在迭代过程中,有其他线程对HashMap进行了修改,迭代器会抛出ConcurrentModificationException异常,这也会导致线程安全问题。
因为在jdk7中,在多线程环境下,扩容时会造成环形链或数据丢失、死循环。因为是链表结构,那么就很容易形成闭合的链路,这样在循环的时候只要有线程对这个HashMap进行get操作就会产生死循环。但是,我好奇的是,这种闭合的链路是如何形成的呢。
发布评论