这是why的第 99 篇原创文章
你好呀,我是why哥。
不是,这个照片不是我,标题说的老爷子就是这个哥们,这事得从前几天说起。
前几天,发现在一个大佬云集的技术群里面,大佬们就 Happens-Before 关系和 as-if-serial 语义进行了激烈的讨论。
而我一看时间,快到 23 点了,大佬们都这么卷,那我必须得跟着卷进去,于是看了一下他们的聊天记录。
而我,作为一只菜鸡,虽然没有什么参与感,但是感觉大佬们说的都挺有道理的,据理力争。
所以基本上,我全程就是这样的:
但是,当他们说着说着就聊到了《Java并发编程实战》,我一下就支棱了起来。
这书我看过啊,而且这书就在我手边呀,终于可以插上话了。
仔细一看,他们说的是书中的 16.1.4 小节:
没啥映像了,甚至连“借助同步”这个词都没有搞明白啥意思。
于是我翻到这一小节,读了起来。
由于这小节篇幅不长,且除了 Happens-Before 关系这个基础知识铺垫外,没有其他的背景,所以我把这一小节截图出来,给大家看看:
怎么样,大家看完之后什么感觉?
是不是甚至都没有耐心看完,一种云里雾里的感觉?
说实话,我看的时候就是这个感觉,每个字都看得懂,但是连在一起就不知道啥意思了。
所以,读完之后的感觉就是:
找源码
但是不慌,文章里面举的例子是 FutureTask ,这玩意并发编程基础之一,我熟啊。
于是决定去源码里面看看,但是并没找到书中举的 innerSet 或者 innerGet 的方法:
由于我这里是 JDK 8 的源码了,而这本书的发布时间是 2012 年 2 月:
由于是译本,原书写作时间可能就更早了。
对比这 JDK 版本发布时间线来看,如果是源码,也是 JDK 8 之前的源码了:
果然,一个大佬告诉我,JDK 6 里面的源码就是这样写的:
但是我觉得去研究 JDK 6 的收益不是很大呀。(主要还是我懒得去下载)
于是,我还是在 JDK 8 的源码里面,发现了一点点蛛丝马迹。
终于搞懂了,什么是“借助同步”了。
而且不得不赞叹 Doug Lea 老爷子的代码,真的是:妙啊。
到底什么是“借助同步”呢?且听我细细道来。