ToB企服应用市场:ToB评测及商务社交产业平台
标题:
并发容器线程安全应对之道
[打印本页]
作者:
罪恶克星
时间:
2022-9-16 17:17
标题:
并发容器线程安全应对之道
2 并发容器线程安全应对之道
引言
在前面,我们学习了hashmap
大家都知道HashMap不是线程安全(put、删除、修改、递增、扩容都无锁)的
所以在处理并发的时候会出现问题
接下来我们看下J.U.C包里面提供的一个线程安全并且高效Map(ConcurrentHashMap)
看一下,他到底是如何实现线程并发安全的
复制代码
2.1 并发容器总体概述
目标:
学习ConcurrentHashMap基本概念和认识它的数据结构
ConcurrentHashMap概念:
ConcurrentHashMap是J.U.C包里面提供的一个
线程安全
的HashMap, 在并发编程中使用的频率(Spring)比较高。
数据结构如下
数组+链表+红黑树+锁(
synchronized+cas
)
总结:
1、数据结构和hashmap一模一样,唯一的区别就是concurrenthashmap在put、删除、修改、递增、扩容和数据迁移的时候都加锁了(syn or cas)
2、加锁只是锁住一个元素,区别于HashTable(整个表,idea可以查看源码来验证)
2.2 并发容器数据结构与继承
目标:
简单认识下ConcurrentHashMap继承关系
总结
ConcurrentHashMap:实现Serializable表示支持序列化
继承AbstractMap(实现map接口),实现了一些基本操作
实现ConcurrentMap接口,封装了map的基本操作
2.3 并发容器源码深度剖析
测试代码
见put部分
复制代码
2.3.1 并发容器成员变量
目标:
认识下ConcurrentHashMap成员变量,先有个印象,方便后续源码分析
private static final int MAXIMUM_CAPACITY = 1 << 30; //table最大容量:2^30=1073741824
private static final int DEFAULT_CAPACITY = 16; //默认容量,必须是2的幂数
static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; ////数组的建议最大值
private static final int DEFAULT_CONCURRENCY_LEVEL = 16; //并发级别,1.8前的版本分段锁遗留下来的,为兼容以前的版本
static final int TREEIFY_THRESHOLD = 8;// 链表转红黑树阀值
static final int UNTREEIFY_THRESHOLD = 6;// 树转链表阀值
static final int MIN_TREEIFY_CAPACITY = 64;// 转化为红黑树的表的最小容量
private static final int MIN_TRANSFER_STRIDE = 16;// 每次进行转移的最小值
//咦?threshold 呢???
复制代码
总结
:该构造函数用于创建一个带有指定初始容量的map
<strong>3、ConcurrentHashMap(Map
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4