concurrentHashMap底层原理

concurrentHashMap默认实现了线程安全性

在JDK1.7及之前的版本,使用的是分段锁

会将一个大数组 数组[0-7],拆分成多个小数组 数组[0-3] 数组[4-7] --> 每个数组对应一个锁

不同的线程请求过来,线程1要put的位置是 数组[1],线程2要put的位置是 数组[4],所以线程1和线程2分别属于不同的锁,它们之间互不影响

 

在JDK1.8及之后,做了一些优化,进行锁粒度的细化

[一个数组],数组里每个元素进行put操作,都是有一个不同的锁,刚开始进行put操作的时候,如果两个线程都是在 数组[1]的位置进行put操作,这个时候采用的CAS的策略

同一时间,只能有一个线程能成功执行这个CAS,就是说刚开始先获取这个 数组[1] 这个位置的值,如果数组[1]的位置为null,线程1进行CAS的比较,put对应的数据,同时间,其它的线程执行CAS,都会失败

分段加锁,通过对数组的每个元素执行CAS的策略,如果多个线程对数组的不同元素执行put操作,互相是不受影响的

如果put操作发现数组[1]的位置有元素了,那么这个位置会基于链表+红黑树进行处理,synchronized(数组[1])进行加锁,基于链表或者红黑树在这个位置put进去自己的数据

总结:

如果你是对数组的同一位置的元素进行操作,才会加锁串行化处理;如果是对数组的不同位置的元素操作,此时大家是可以并行处理的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值