Java小白进阶系列——ConcurrentHashMap源码解析文章总目录

简介: Java小白进阶系列——ConcurrentHashMap源码解析文章总目录

ConcurrentHashMap源码解析_01 成员属性、内部类、构造方法分析

ConcurrentHashMap源码解析_02 预热(内部一些小方法分析)

ConcurrentHashMap源码解析_03 put方法源码分析

ConcurrentHashMap源码解析_04 transfer方法源码分析(难点)

ConcurrentHashMap源码解析_05 get、remove方法

ConcurrentHashMap源码解析_06 红黑树的代理类(TreeBin)

下面是引用彤哥源码公众号文章中的片段: ConcurrentHashMap完整小节 上对并发HashMap的简单总结~


总结:


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


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


(3)ConcurrentHashMap相比于同样线程安全的HashTable,效率要高很多;


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


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


(6)sizeCtl = -1,表示正在进行初始化;


(7)sizeCtl = 0,默认值,表示后续在真正初始化的时候使用默认容量;


(8)sizeCtl > 0,在初始化之前存储的是传入的容量,在初始化或扩容后存储的是下一次的扩容门槛;


(9)sizeCtl = (resizeStamp << 16) + (1 + nThreads),表示正在进行扩容,高位存储扩容邮戳,低位存储扩容线程数加1;


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


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


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


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


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


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


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


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


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


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


ConcurrentHashMap中有哪些值得学习的技术呢?

(1)CAS + 自旋,乐观锁的思想,减少线程上下文切换的时间;

(2)分段锁的思想,减少同一把锁争用带来的低效问题;

(3)CounterCell,分段存储元素个数,减少多线程同时更新一个字段带来的低效;

(4)@sun.misc.Contended(CounterCell上的注解),避免伪共享;

(5)多线程协同进行扩容;


相关文章
|
2天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。

推荐镜像

更多