HashMap
为什么HashMap是线程不安全的
同时put碰撞导致数据丢失
同时put扩容导致数据丢失
并发容器概览
ConcurrentHashMap:线程安全的HashMap
CopyOnWriteArrayList:线程安全的List
BlockingQueue:这是一个接口,表示阻塞队列,非常使用用于作为数据共享的通道
ConcurrentLinkedQueue:高效的非阻塞并发队列,使用链表实现。可以看做一个线程安全的LinkedList
ConcurrentSkipListMap:是一个Map,使用跳表的数据结构进行快速查找
ConcurrentHashMap
putVal流程
判断key value不为空
计算hash值
根据对应位置节点的类型,来赋值,或者helpTransfer,或者增长链表,或者给红黑数增加节点
检查满足阀值就“红黑树化”
返回oldVal
get流程
计算hash值
找到对应的位置,根据情况进行:
直接取值
红黑树里找值
遍历链表取值
返回找到的结果
组合操作,解决线程不安全
replace:先比较,如果未修改就更新值
putIfAbsent:判断当前key是否有值,没有值则赋值,有则取出
CopyOnWriteArrayList
适用场景
读写规则
读写锁规则升级:读取完全不用加锁,并且写入也不会阻塞读取操作。只有写入与写入需要进行同步等待