Java

HikariCP 源码分析 --  ConcurrentBag

HikariCP 源码分析 -- ConcurrentBag

D瓜哥
以前无意间搜资料了解到 HikariCP,一下子就被它的简洁代码和卓越性能吸引住了。以前也有翻过它的代码,但是不是很系统,最近再次翻阅,正好做些笔记,方便以后学习。 D瓜哥最近在学习 Java 并发知识。那就从 HikariCP 自定义的并发集合 ConcurrentBag 开始学习。 在 HikariCP 的 Wiki 中,有 Down the Rabbit Hole · ConcurrentBag 的章节来专门介绍 ConcurrentBag: ConcurrentBag 的灵感借鉴自 C# .NET 的 ConcurrentBag 类。但是实现却是完全不同的。这里的 ConcurrentBag 有如下特性: A lock-free design ThreadLocal caching Queue-stealing Direct hand-off optimizations 下面,通过代码来对此做个说明。 在 ConcurrentBag 类的定义中,声明了集合元素必须是 IConcurrentBagEntry 的子类。先来看看这个接口的定义: public interface IConcurrentBagEntry { int STATE_NOT_IN_USE = 0; int STATE_IN_USE = 1; int STATE_REMOVED = -1; int STATE_RESERVED = -2; boolean compareAndSet(int expectState, int newState); void setState(int newState); int getState(); } 接下来,看一下成员变量:

推荐几本 Java 并发编程的书

D瓜哥
最近,D瓜哥的一个小伙伴向我抱怨,Java 并发是个大坑,问我怎么看?我回答,当然是用眼睛看啊… D瓜哥觉得,想学好 Java 并发,最重要的还是啃书。幸运的是,Java 中还是有不少关于并发的优秀书籍可以看。正好利用这个机会,把看过的、个人认为还不错的书推荐一波。没有看过的就不多言了。 Java并发编程实战 如果只选一本书来深入研究并发,那肯定是这本书。 Java并发编程实战 (豆瓣) — 这本书是必看的。JDK 中 JUC 就是这本书的作者们写的。虽然书名含有 Java 一次,但是,里面更多是原理性的东西,各种语言都适用。只是例子少了一些。这本书需要多读几遍。(据说翻译不行,推荐看英文版) 放个英文版图片镇楼: Java并发编程的艺术 Java并发编程的艺术 (豆瓣) — 这本书也不错,讲了很多源码方面的内容,非常棒。另外,在讲解 Double Lock 方面的知识时,涉及了很多 Java Memory Model 方面的知识,可以先看看 深入理解Java虚拟机(第3版)(豆瓣) 最后两章的内容,来提前补充一下这么方面的知识。 实战Java高并发程序设计 实战Java高并发程序设计(第2版) (豆瓣) — 这本书也不错,针对 Java 8 写的,Java 8 中的很多新知识都有涉猎,例子也很全面。广度和深度,得到了兼顾,非常棒。 Java编程思想 Java编程思想(第4版)(豆瓣) — 虽然这本书已经出来十余年了,但是依然经典。第 21 章 并发,用大量的例子和陈述来介绍并发。非常棒。美中不足,是针对 Java 5 编写的,现在已经 Java 8 了。不过,作者又出了一本书,可以理解成升级版。 On Java 8 On Java 8 (豆瓣) — 这是《Java编程思想》的姊妹版和升级版。Bruce Eckel 的写书功底和对语言的理解毋庸置疑。目前中文版还没有正式版,网上已经有热心网友做起来搬运工,感兴趣自行 Google。 Java 9 并发编程实战 Java 9 并发编程实战 (豆瓣) — 入门的话,这本书是不错的选择。每个特性一个例子,整本书大概 80% 的篇幅都是代码。所以,一定也不用担心有读书压力。

只要一部计算机,就可以创造出无限的世界

D瓜哥
曾经写给学弟学妹的一封信。我觉得还行,发出来,希望对刚学计算机专业的朋友有所帮助。当然,如果哪位朋友有更好的想法,也请留言,大家讨论讨论。原文如下: 致师弟师妹的一封信 各位朋友: 大家好! 从本周开始,我必须专心为我的前程奋斗了。很可惜不能和大家一起学习了。这封信就算是我和大家的一个告别吧。 首先,感谢史老师给我提供这个和大家一起学习和交流的机会,让我和大家一起度过了一段特殊而愉快的时光。 其次,我应该感谢大家。由于本人水平有限,也许我没能让大家从我这里学到太多知识,但是大家却让我学会了很多东西,锻炼了我很多方面的能力。单凭这一点,我就应该感谢大家。同时,很多人把我当朋友,更使我感激不尽。 再次,在这短暂而又宝贵的大学时光里,大家走的路应该和我的基本一样。我以一个过来人的身份,和大家分享一下我的学习经验吧,希望可以让大家少走甚至不走弯路。 先说一点我们所学科目的情况吧。 Linux:一定要动手敲指令。在我们一年半的学习时光里,我认为Linux是我们所学的所有实践性学科里面最简单的一科了!只要把指令记好用熟就行了!另外,指令不需要背,用多了自然就记住了。(相信95%的同学都知道cd是什么意思吧!为什么呢?因为用它的次数多!)多提一点,一定要多尝试! Java或者C#或者PHP(由于个人比较喜欢Java,所以,一下描述Java的地方,你可以同样换成C#或在PHP等):这是我们大家必须要下苦功夫学好的课!而且一定一定要学精!它们在我们的课程体系结构中的作用,就像是地基对于这个房子的作用!根基不好,房子很难建高的!即使建好也是豆腐渣工程。毕竟“空中楼阁”只存在于我们的想象中。它们是学习JSP、ASP.NET、J2EE、“游戏开发”、网页开发等等的基础,Java或者C#或者PHP学不会,这些课很难学好!(我这里有Java的教学视频,感兴趣的同学可以来我寝室拷贝。也可以上网下载:http://www.verycd.com/topics/93279/(请下载J2SE的)) 数据库:重点是关系模型、 SQL语句以及后面的数据库设计。做动态网站的技术、做桌面程序,甚至做手机应用等,都会用到数据库!以后工作中数据模型设计、数据查询等都要求有比较扎实的数据库基础才行。 数据结构:我个人认为学习数据结构就是学习一种解决问题的思想。其实,类库已经实现了我们所学的所有的数据结构,到时会用就行了! 现在NBA正在进行季后赛,就用乔丹的一句话,作为所有学科的一个共同的建议送给大家: I can accept failure, but I can’t accept not trying. — Michael Jordan 其实学习就是不断尝试,不断总结,不断进取的一个过程。我可以用我的尝试告你一个正确的结果,但是自己尝试出来的结果印象更加深刻! 再说一点我的个人的学习感触吧。我个人认为,这些比我们大家在学校学到知识更为重要!知识马上就会过时,但是学习的方法却可以带领我们走的更远。 一、享受学习。如果我们把学习当成像玩游戏、听音乐一样的娱乐活动时,我想这会给我们一种全新的感觉。Study hard,have fun,make history! By Jeff Bezos & Joy Lee (努力学习,乐在其中,并创造历史!—Jeff Bezos(Amazon.com的创办者兼CEO,Joy Lee就是我。(*__*) 嘻嘻…… 这句话是我从他的一句话里改编过来的!)) 其实,学计算机学科非常有趣!Linux里面,几行指令,我们就可以顺利的让鼠标在两个操作系统自由转换!Java里面几行,几十行代码就有一个漂亮的窗口!C#里面随便一个拖拽,也是一个不错的窗口!“只要一部计算机,就可以创造出无限的世界。”(出自蔡学镛《写程序,好好玩》,《Java夜未眠》里面的一篇,本书是本很搞笑的编程感触散文集,推荐看看。)加油吧!相信你行! 二、坚持不懈。任何事情都不是可以一蹴而就的,都需要我们坚持!再送给大家一句话:失败只有一种,那就是半途而废! 三、舍我其谁的豪迈和霸气。“Horse’s,Gosling能创造出来Java,我就不信我学不会!一个破Java,我还不放到眼里呢!!”,“别人能创造出来,我就不相信我学不会?!”不过,也要给大家提醒一句:“战略上,藐视敌人;战术上,重视敌人”!一定要下功夫学习才行! 四、信心。一定要相信自己的能力!你是独一无二,无可替代的!信心能让你从一个更高的角度看待你的学习!能给你一种驾驭知识的成就感!这种感觉能让你从学习中找到乐趣! 五、行动!上面的大道理,我们大家都懂!但是,谁实际做到呢?伟大与平凡的区别也许就在于这一点吧。我以我自己的高中、大学对比来看,行动与否结果绝对是不一样的!只想不做,最多是个空想家!所以,大家一定要“坚持不懈的行动”! 最后,送给大家一句话:你充满了潜能,但你的努力还远远不够!再次怀念我们共同的学习时光! 祝大家学有所成! D瓜哥