成都网站建设成都app开发,新县住房和城乡规划建设局网站,中诺建设集团网站,天元建设集团有限公司上班时间#x1f4eb;作者简介#xff1a;小明Java问道之路#xff0c;2022年度博客之星全国TOP3#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化#xff0c;文章内容兼具广度、深度、大厂技术方案#xff0c;对待技术喜欢推理加验证#xff0c;就职于… 作者简介小明Java问道之路2022年度博客之星全国TOP3专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化文章内容兼具广度、深度、大厂技术方案对待技术喜欢推理加验证就职于知名金融公司后端高级工程师。 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家 如果此文还不错的话还请关注、点赞、收藏三连支持一下博主~ 文末获取联系 精彩专栏推荐订阅收藏 专栏系列点击解锁 学习路线点击解锁 知识定位 Redis从入门到精通与实战 Redis从入门到精通与实战 围绕原理源码讲解Redis面试知识点与实战 MySQL从入门到精通 MySQL从入门到精通 全面讲解MySQL知识与企业级MySQL实战 计算机底层原理 深入理解计算机系统CSAPP 以深入理解计算机系统为基石构件计算机体系和计算机思维 Linux内核源码解析 围绕Linux内核讲解计算机底层原理与并发 数据结构与企业题库精讲 数据结构与企业题库精讲 结合工作经验深入浅出适合各层次笔试面试算法题精讲 互联网架构分析与实战 企业系统架构分析实践与落地 行业最前沿视角专注于技术架构升级路线、架构实践 互联网企业防资损实践 互联网金融公司的防资损方法论、代码与实践 Java全栈白宝书 精通Java8与函数式编程 本专栏以实战为基础逐步深入Java8以及未来的编程模式 深入理解JVM 详细介绍内存区域、字节码、方法底层类加载和GC等知识 深入理解高并发编程 深入Liunx内核、汇编、C全方位理解并发编程 Spring源码分析 Spring核心七IOC/AOP等源码分析 MyBatis源码分析 MyBatis核心源码分析 Java核心技术 只讲Java核心技术 本文导读 一、ConcurrentHashMap底层实现JDK1.8
底层数据结构Node 红黑树 保证线程安全的方式乐观锁 Sysnchronized1.8中的分段其实就是table数组中一个个的hash槽这样使得添加节点时加锁粒度更小并发度也更高
Sysnchronized 锁 : 锁是锁的链表的head的节点不影响其他元素的读写锁粒度更细效率更高扩容时阻塞所有的读写操作(因为扩容的时候使用的是Synchronized锁)并发扩容
读操作是无锁Node 的 val 和 next 使用 volatile 修饰读写线程对该变量互相可见数组用volatile修饰保证扩容时被读线程感知。 /*** 每个 Node 里面是 key-value 的形式* 并且把 value 用 volatile 修饰以便保证可见性* 同时内部还有一个指向下一个节点的 next 指针方便产生链表结构*/
static class NodeK,V implements Map.EntryK,V {final int hash;final K key;volatile V val;volatile NodeK,V next;// ...
}
为什么在有Synchronized 的情况下还要使用CAS
因为CAS是乐观锁,在一些场景中(并发不激烈的情况下)它比Synchronized和ReentrentLock的效率要高,当CAS保障不了线程安全的情况下(扩容或者hash冲突的情况下)转成Synchronized 来保证线程安全,大大提高了低并发下的性能.
二、ConcurrentHashMap底层实现JDK1.7