继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

再来一篇!看jdk源码大师亲自操刀编写的集合源码!

看点代码再上班
关注TA
已关注
手记 5
粉丝 1
获赞 8

全文共计1959字18图预计阅读时间13分钟

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

iShot2021-03-06 16.00.36.png

这个图拍摄于老家县城一售楼处。作为外出上班的一族一年365天在家的时间常常不超过十天。

在侃技术前聊一聊自己对家乡变化的感慨。

最大的感慨莫过于我们县城要通高铁了以后老家和工作之地的距离将变成2小时想想就觉得这是一件多么幸福的事。

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

iShot2021-03-06 16.54.41.png

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

房子本来最早于2019年已打算购置但当时时间仓促没看好加之2020年过年刚好遇上疫情足不出户一耽搁就到了2021年。

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

其实这里唠嗑只是想感慨一下小城市的变化之大但是我们很多人却容易忽略身边最亲近的事与物。比如我我竟然不知我们县城的政务中心都搬迁了整个县城南片区规划建设已相当完善商品房、幼儿园、中小学校区、超宽大道等等随处可见新医院、新行政办公楼、高铁站等这些似乎在缩小与大城市的差距。

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

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

朋友们你们觉得呢你们家乡还有哪些变化

ConcurrentHashMap

我们打开ConcurrentHashMap源码类开头鲜明地标着作者 @author Doug Lea

image.png

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

image.png

我们找到jdk1.7的源码ConcurrentHashMap中的get方法还能看到Doug Lea的代码下图源码截图基于jdk7-b147

image.png

我们知道HashMap 是线程不安全的并发情况下使用hashmap有cpu飙升的风险。为了使用线程安全的 HashMap我们常使用 ConcurrentHashMap。

本文基于jdk1.7讲解所以concurrenthashmap还是采用分段锁。

image.png

ConcurrentHashmap默认有16个Segment最多支持65536个Segment这是可以通过ConcurrentHashMap的构造器指定的。默认情况下ConcurrencyLevel等于16

image.png

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

image.png

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

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

image.png

ConcurrentHashMap定义了一个Segment数组segmentsSegment则定义了一个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官方也不建议开发者使用它。

结语

我是tin一个在努力让自己变得更优秀的普通攻城狮。自己阅历有限、学识浅薄如有发现文章不妥之处非常欢迎加我提出我一定细心推敲加以修改。

看到这里请安排个“三连”分享、点赞、在看再走吧坚持原创不容易不要白嫖你的正反馈是我坚持输出的最强大动力谢谢

20190911181805AMQR5B8FDFDAXGLA.gif

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP