ConcurrentHashMap被认为是支持高并发、高吞吐量的线程安全一个HashMap实现,因此多线程开发中经常使用到,但是最近在开发中却遇到了数据不一致问题,给自己埋了个大坑,下面描述下问题:
首先是工作场景描述:有一个订单列表,每个订单又包含多种类型的任务,每个线程一次只能处理一种类型的任务(取所有订单的该类型的任务,进行批量处理,任务没有先后关系),某订单处理完毕后,修改订单状态。
代码如下:
public class TaskRunner implements Runnable{
//订单id列表
private final List<String> orderList;
//订单与任务类型列表对应关系,key是订单id,value是任务列表
private final ConcurrentHashMap<String, List<String>> contentMap;
//所有的任务类型
private final ConcurrentLinkedQueue<String> typeQueue;
public TaskRunner(ConcurrentHashMap<String, List<String>> contentMap,
ConcurrentLinkedQueue<String> type,
List<String> orderList) {
this.contentMap = contentMap;
this.typeQueue = type;
this.orderList = orderList;
}
@Override
public void run()