写点什么

从一个并发异常问题引起的想法

用户头像
卢卡多多
关注
发布于: 2 小时前
从一个并发异常问题引起的想法

1.HashMap 的底层:

数组+链表/红黑树

2.几个变量和常量:

默认的初始容量=1<<4    =>16(左移-->2 的 4 次方;


**MaxMum_capacity=1<<30  最大的容量;


(3)Default_load_Factor:默认的加载因子 0.75;


static final float DEFAULT_LOAD_FACTOR = 0.75f;
复制代码


(4)threshold:树化阈值


 static final int TREEIFY_THRESHOLD = 8;
复制代码


数组后面一个元素的链表的元素


是八个---就要考虑--是一个树形(查询变快;);


(5)  反树化--要是数值比 6 小---考虑的是变成链表;


static final int UNTREEIFY_THRESHOLD = 6;
复制代码


树--删除成 6 变成-0-链表


链表多啦---元素多啦---直接是变成树;


(6)当单个链表的结点为 8 个,但是 table 的长度为 64,才会树化;


当单个链表的结点为 8 个,但是 table 的长度未达到 64,会扩容;


static final int MIN_TREEIFY_CAPACITY = 64;
复制代码

2.JDK1.8 的源码分析:

(1)初始化:


public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); }
/** * Constructs an empty <tt>HashMap</tt> with the default initial capacity * (16) and the default load factor (0.75). */ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted //表示的是将加载因子设置为默认的0.75 //其他字段都是默认值; /* size=0; table=null; threshold=0阈值; */ }
复制代码

(2)添加的问题:


然后是开始进行 put:



--创建一个默认的 16 的数组,


阈值为 12



阈值到达 12 之后--增加到 2 倍;


\


新数组的容量是 16 的 2 倍 32;



3.集合中 ModCount 的作用:

每个集合中都有;



transient int modCount;\


记录的是当前集合被修改的次数:


add()或者是 remove()


当自己 modCOUNT 的记录数和这个 ExpectCount 不一致-----》并发修改异常


一个在 add()    ModCount 增加 1;


要是不一致--直接是输出异常;


导致的 currentModificationException()的并发修改异常;

记录一下并发修改异常:


如果我们想过滤出其中的对象,组成一个新的集合:我建议使用 stream 流中的 filter 的作为过滤条件;

如果说是两个集合进行对比过滤:

我的建议是将,单个 list 集合转化成 map; key-value,其中 value 是哪个对象;


接着遍历另外一个集合,从而判断出需要过滤后的新集合;

发布于: 2 小时前阅读数: 4
用户头像

卢卡多多

关注

努力寻找生活答案的旅途者 2020.04.12 加入

公众号:卢卡多多,欢迎一起交流学习

评论

发布
暂无评论
从一个并发异常问题引起的想法