fjd*_*gsd 3 java blockingqueue
我正在阅读 LinkedBlockingQueue 代码(JDK8u),我发现 LinkedBlockingQueue 的 head 字段不是私有的,但最后一个字段是私有的。我找不到 head 的任何特定操作。那么为什么不将 head 设置为私有呢?
/**
* Head of linked list.
* Invariant: head.item == null
*/
transient Node<E> head;
/**
* Tail of linked list.
* Invariant: last.next == null
*/
private transient Node<E> last;
Run Code Online (Sandbox Code Playgroud)
首先是一些事实。
head字段是private.head字段是包私有的……并且它有关于不变量的注释。那么他们为什么要改变它呢?
到目前为止我还没有弄清楚,但可能的原因可能包括:
head?为什么不呢tail?)在花了 20 分钟查看 Github 上的历史记录后,我认为这可能是一个意外。更改似乎发生在这个提交中(https://github.com/openjdk/jdk8u/commit/6f31fa54ac050d781656d6e8ed18a40b55ef5c0d)......根据“gitblame”。但是当我查看提交中的内容时,我根本看不到更改,更不用说目的1了。这真是令人费解。
也许在 Mercurial 历史2中更清楚。
无论如何,这整件事都是好奇心的锻炼。他们为什么改变它并不重要,并且它不会影响他们所做的任何用户代码3。
1 - 变更集描述表明它只是与类的原始/主要作者维护的私有存储库同步java.util.concurrent。
2 - 我们正在寻找权威 Mercurial 存储库的只读 Git 镜像。镜子的创建过程中可能出现了一些问题。
3 - ...与用户代码中已存在的 Heisenbug 进行模交互。