关于java:再来一篇看jdk源码大师亲自操刀编写的集合源码

27次阅读

共计 2157 个字符,预计需要花费 6 分钟才能阅读完成。

全文共计 1959 字 18 图,预计浏览工夫 13 分钟

                    大家好,我是 tin,这是我的第 8 篇原创文章

这个图拍摄于老家县城一售楼处。作为外出下班的一族,一年 365 天在家的工夫经常不超过十天。

在侃技术前,聊一聊本人对 他乡变动 的感叹。

最大的感叹莫过于,咱们县城要通高铁了,当前老家和工作之地的间隔将变成 2 小时!想想就感觉这是一件如许幸福的事。

今年过年回家趁着假期和家人又新购买了一套新商品期房,就买高铁站片区边上。

在家买房的最大特点就是,房子面积要大的,动不动都一百多两百平,在深圳这个中央就不敢想啦。

房子原本最早于 2019 年已打算购买,但过后工夫仓促没看好,加之 2020 年过年刚好遇上疫情,足不出户,一耽误就到了 2021 年。

或者刚好是疫情的起因,往年房价特价销售(也就是提价了),绝对 2019 年降了 500-1000 元 /㎡。在这种七八线城市,房价本就几千块一平,这个提价幅度是异样高的(打心里认为,2021 年是小城购房最佳时机之一)。

其实,这里唠嗑只是想感叹一下小城市的变动之大!然而咱们很多人却容易疏忽身边最亲热的事与物。比方我,我居然不知咱们县城的政务核心都搬迁了,整个县城南片区布局建设已相当欠缺,商品房、幼儿园、中小学校区、超宽小道等等随处可见,新医院、新行政办公楼、高铁站等这些仿佛在放大与大城市的差距。

这些年,国家对农村建设力度也很大,肉眼可见的变动经常被咱们谈及。广泛被提到的一个变动是路变好了。村村通公路、水泥路,每年外出回家的人肯定能感触到。路变好,相应的是,车也就多了。买车的人越来越多,每家都会有一辆代步小轿车。

除了车,家里爸爸妈妈们网上购物更加频繁,比起以往,老人们都能够自行网上购物,自行取快递,这种线上体验的场景规模越来越空大,所以,农村通宽带也已不是什么新鲜事。

敌人们,你们感觉呢,你们他乡还有哪些变动?

ConcurrentHashMap

咱们关上 ConcurrentHashMap 源码,类结尾显明地标着作者:@author Doug Lea

Doug Lea 是谁?以前也有提到过,他是一位大学老师,同时也是世界上对 Java 影响最大的人之一。JDK 源码中 java.util.concurrent 包就是他创作的。

咱们找到 jdk1.7 的源码,ConcurrentHashMap 中的 get 办法还能看到 Doug Lea 的代码(下图源码截图基于 jdk7-b147)

咱们晓得,HashMap 是线程不平安的,并发状况下应用 hashmap 有 cpu 飙升的危险。为了应用线程平安的 HashMap,咱们常应用 ConcurrentHashMap。

本文基于 jdk1.7 解说,所以 concurrenthashmap 还是采纳分段锁。

ConcurrentHashmap 默认有 16 个 Segment,最多反对 65536 个 Segment,这是能够通过 ConcurrentHashMap 的结构器指定的。默认状况下 ConcurrencyLevel 等于 16

如果指定 ConcurrencyLevel,最大只能等于 65535

Segment 通过继承 ReentrantLock 来进行加锁,每次锁住一个 segment 来保障每个 Segment 内的操作的线程安全性从而实现全局线程平安。

定位一个元素的过程须要进行两次 Hash 操作,第一次 Hash 定位到 Segment,第二次 Hash 定位到元素所在的链表的头部。看看 get 办法的源码:

ConcurrentHashMap 定义了一个 Segment 数组 segments,Segment 则定义了一个 HashEntry 数组 table。

这种两级定位的构造带来的副作用是 hash 过程要比一般的 HashMap 要长,然而带来的益处是更大的,写操作能够只对元素所在的 Segment 进行加锁即可,不会影响到其余的 Segment,这样,ConcurrentHashMap 能够反对最大 Segment 数量的并发量,吞吐量就比 HashMap 大了很多。

仔细的你可能曾经发现,代码截图中应用到了UNSAFE.getObjectVolatile(segments, u),这个是什么意思呢?

getObjectVolatile 是为保障并发拜访数组的第 k 个元素能够显式 volatile 读取,为了值的可见性。

说到 Unsafe,这玩意儿咋一看感觉很高大上,因为咱们平时编程简直没见过。然而,Unsafe 当初在 Java 外面是一个“擦边球”,根本处于一个“不举荐应用”的状态。

Unsafe 是位于 sun.misc 包下的一个类,次要提供一些用于执行低级别、不平安操作的办法,如间接拜访零碎内存资源、自主治理内存资源等。因为能够拜访系统资源、能够自主操作内存空间,这无疑减少了程序产生指针问题的危险,Java 的垃圾回收器原本很大一个起因是为了解决这个问题,应用 Unsafe 类会使得程序出错的概率变大,Java 官网也不倡议开发者应用它。

R 大有一篇答复,对于 Unsafe,为什么 JUC 中大量应用了 sun.misc.Unsafe 这个类,但官网却不倡议开发者应用?– 知乎

结语

我是 tin,一个在致力让本人变得更优良的一般攻城狮。本人经历无限、学识肤浅,如有发现文章不妥之处,十分欢送加我提出,我肯定仔细斟酌加以批改。

保持原创不容易,你的正反馈是我保持输入的最弱小能源,谢谢!

正文完
 0