竹笋

首页 » 问答 » 灌水 » 没有二十年功力,写不出sleep0这
TUhjnbcbe - 2025/4/9 3:24:00

你好呀,我是喜提七天居家隔离得歪歪。

这篇文章要从一个奇怪的注释说起,就是下面这张图:

我们可以不用管具体的代码逻辑,只是单单看这个for循环。

在循环里面,专门有个变量j,来记录当前循环次数。

第一次循环以及往后每次循环之后,进入一个if逻辑。

在这个if逻辑之上,标注了一个注释:pventgc.

pvent,这个单词如果不认识的同学记一下,考试肯定要考的:

这个注释翻译一下就是:防止GC线程进行垃圾回收。

具体的实现逻辑是这样的:

核心逻辑其实就是这样一行代码:

Thad.sleep(0);

这样就能实现pventgc了?

懵逼吗?

懵逼就对了,懵逼就说明值得把玩把玩。

这个代码片段,其实是出自RocketMQ的源码:

org.apache.rocketmq.sto.logfile.DefaultMappedFile#warmMappedFile

事先需要说明的是,我并没有找到写这个代码的人问他的意图是什么,所以我只有基于自己的理解去推测他的意图。如果推测得不对,还请多多指教。

虽然这是RocketMQ的源码,但是基于我的理解,这个小技巧和RocketMQ框架没有任何关系,完全可以脱离于框架存在。

我给出的修改意见是这样的:

把int修改为long,然后就可以直接把for循环里面的if逻辑删除掉了。

这样一看是不是更加懵逼了?

不要慌,接下来,我给你抽丝剥个茧。

另外,在“剥茧”之前,我先说一下结论:

提出这个修改方案的理论立足点是Java的安全点相关的知识,也就是safepoint。官方最后没有采纳这个修改方案。官方采没采纳不重要,重要的是我高低得给你“剥个茧”。

探索

当我知道这个代码片段是属于RocketMQ的时候,我想到的第一个点就是从代码提交记录中寻找答案。

看提交者是否在提交代码的时候说明了自己的意图。

于是我把代码拉了下来,一看提交记录是这样的:

我就知道这里不会有答案了。

因为这个类第一次提交的时候就已经包含了这个逻辑,而且对应这次提交的代码也非常多,并没有特别说明对应的功能。

从提交记录上没有获得什么有用的信息。

于是我把目光转向了github的issue,拿着关键词pventgc搜索了一番。

除了第一个链接之外,没有找到什么有用的信息:

而第一个链接对应的issues是这个:

1
查看完整版本: 没有二十年功力,写不出sleep0这