> 文档中心 > ConcurrentHashMap源码分析

ConcurrentHashMap源码分析


为什么需要ConcurrentHashMap,HashMap为什么有线程安全问题

在前面的HashMap源码分析文章中我们提到在多个线程访问同一个HashMap对象时要注意线程安全问题,那么HashMap究竟有什么样的线程安全问题呢?

线程安全问题源于多个线程对共享可变变量进行并发修改读取且缺少必要的同步操作,可能导致原子性、可见性、重排序等问题。

下面介绍几种可能出现的线程安全问题

线程安全问题举例1: 数据丢失问题

在HashMap源码分析文章中我们了解到在put方法写入key value数据时,如果没有找到对应的key,则会在链表的末端写入一个新的Node。

ConcurrentHashMap源码分析

如果这时同时有两个线程都要在这个链表尾部添加新的Node节点可能出现什么情况呢?

我们再看一下HashMap中向结尾写入Node节点的代码,是先判断next==null,然后给结尾的Node对象的next字段赋值为新的Node对象。
当线程1和线程2同时执行到if判断语句,同时得到true,然后同时执行if内部的代码,就可能导致线程1先给p.next赋值Node1,然后线程2又给p.next赋值Node2,
导致Node1的数据丢失。


B2C跨境电商