JUC工具包下的集合

在这里插入图片描述

遗留的安全集合和修饰的安全集合都是使用synchronized修饰整个方法

Java8:ConcurrentHashMap
结构和HashMap一样,数组加链表,但是不允许空键值
Get():取值
全程无锁
如果头结点的哈希值为-1,表示正在扩容;如果头结点的哈希值为-2,表示该链表已经变为红黑树了,这时调用对应的方法去取值
如果头结点的哈希值大于0,说明是链表,直接取值即可,这里不会取到脏数据,因为值用了volatile修饰
在这里插入图片描述

PutVal():放值
如果哈希表为空,则调用initTable()(cas实现)来初始化表
如果没头结点,说明没哈希冲突,自己当头结点(cas设置
如果头结点哈希值为-1,说明正在扩容,帮忙扩容
如果有头结点,说明有哈希冲突,锁头结点,遍历链表找是否有相同key,相同则替换;没有则追加结点到尾部
最后要调用addCount()来进行元素数量的更新

InitTable():初始化数组
sizeCtl=0 代表没有线程正在初始化数组
sizeCtl=-1 代表有线程正在初始化数组
while(数组为空){
如果sizeCtl<0,说明有其他线程正在初始化数组,则yield
如果sizeCtl==0,用cas尝试把sizeCtl从0改为1
如果更改成功,初始化数组,并且把sizeCtl改为数组长度
如果更改失败,continue
}

Transfer():扩容
新建一个数组,长度是原来数组的两倍,然后开始搬迁链表
如果头结点为空,说明这个链表已经被处理完了,用cas把链表头替换成forwarding;
如果头结点的哈希值为-1,说明这个链表正在被别的线程处理或者以及处理完了,则去处理下一个链表;
如果不为空,说明要处理这个链表,锁住头结点进行处理

Java7:ConcurrentHashMap
结构:Segment数组,数组的元素为数组加链表,套娃,对每个Segment数组元素单独加锁,也就是分段锁,提高了并发
在这里插入图片描述

LinkedBlockingQueue:两把ReentranLock锁putlock、takelock,两个条件变量notFull、notEmpty
ConcurrentLinkedQueue:也是两把锁,不过是用CAS实现的,用在tomcat里面,用于Acceptor和Poller连接

CopyOnWriteArraylist:写入时复制,写时都会复制一份数组进行写,读的话还在原来的数组中读,读写分离但弱一致性(因为写完时对数组引用进行覆盖,但是读之前获取的是旧引用,指向的是旧对象,你只修改了引用没有修改对象,所以读的是之前的数组),适合读多写少场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值