Java中线程安全的集合

使用Collections包装线程不安全的类,使其成为线程安全的类,使用的是sync,效率并无实质提升:

concurrent包下的线程安全集合:blocking,copyonwrite,concurrent。

 

coucurrentMap每个方法都是原子的,但是几个方法的组合并不是原子的。concurrentMap是细粒度的锁。普通的HashMap在扩容的时候会有并发死链的问题。

ConcurrentHashMap的原理:‘

 ConcurrentHashMap在扩容时保证线程安全:

 

在扩容过程中,处理完毕的链表头节点置为fnode,表明此链表已经处理完毕。其他线程来get,则会到新的线程中去get。

 

TreeBin是红黑树的头结点,TreeNode是红黑树的树节点。

整个get流程:

hash为负数则去新的扩容的HashMap查找元素。

ConcurrentHashMap不允许有空的键值,put的过程中,只有发生下标冲突,才会使用sync,而且锁的是桶的头节点。

初始化HashTable,只有一个线程成功,只有一个线程cas成功,然后初始化哈希表:

 addCount:当哈希表put成功后,增加计数。

put流程,插入新值:

进入下面的else,说明桶下标冲突了,此时需要对链表头节点加锁,fh >= 0,说明是普通节点,进行普通的插入流程即可,bigcount代表链表长度。

 节点的类型是红黑树:

 

 bigcount(节点数)和门限值比较,看是否需要转化为红黑树:

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值