ConcurrentHashMap 学习+面试

黑马视频讲解

总结:

(1)ConcurrentHashMap是HashMap的线程安全版本;

(2)ConcurrentHashMap采用(数组 + 链表 + 红黑树)的结构存储元素;

(3)ConcurrentHashMap相比于同样线程安全的HashTable(直接在方法上加synchronized),效率要高很多;

(4)ConcurrentHashMap采用的锁有 synchronized,CAS,自旋锁,分段锁,volatile等;

(5)ConcurrentHashMap中没有threshold和loadFactor这两个字段,而是采用sizeCtl来控制;

  • sizeCtl = -1,表示正在进行初始化;
  • sizeCtl = 0,默认值,表示后续在真正初始化的时候使用默认容量;
  • sizeCtl > 0,在初始化之前存储的是传入的容量,在初始化或扩容后存储的是下一次的扩容门槛;
  • sizeCtl = (resizeStamp << 16) + (1 + nThreads),表示正在进行扩容,高位存储扩容邮戳,低位存储扩容线程数加1;

(6)更新操作时如果正在进行扩容,当前线程协助扩容;

(7)更新操作会采用synchronized锁住当前桶的第一个元素,这是分段锁的思想;

(8)整个扩容过程都是通过CAS控制sizeCtl这个字段来进行的,这很关键;

(9)迁移完元素的桶会放置一个ForwardingNode节点,以标识该桶迁移完毕;

(10)元素个数的存储也是采用的分段思想,类似于LongAdder的实现;

(11)元素个数的更新会把不同的线程hash到不同的段上,减少资源争用;

(12)元素个数的更新如果还是出现多个线程同时更新一个段,则会扩容段(CounterCell);

(13)获取元素个数是把所有的段(包括baseCount和CounterCell)相加起来得到的;

(14)查询操作是不会加锁的,所以ConcurrentHashMap不是强一致性的;

(15)ConcurrentHashMap中不能存储key或value为null的元素;
 

ConcurrentHashMap中有哪些值得学习的技术呢?
(1)CAS + 自旋,乐观锁的思想,减少线程上下文切换的时间;
(2)分段锁的思想,减少同一把锁争用带来的低效问题;
(3)CounterCell,分段存储元素个数,减少多线程同时更新一个字段带来的低效;
(4)@sun.misc.Contended(CounterCell上的注解),避免伪共享;
(5)多线程协同进行扩容;
 

线程安全的集合类

线程安全集合类可以分为三大类:
1.遗留的线程安全集合如 Hashtable Vector
2.使用 Collections 装饰的线程安全集合,如:
  • Collections.synchronizedCollection
  • Collections.synchronizedL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值