java - 为什么 LinkedBlockingQueue 的头部不是私有(private)的?

标签 java blockingqueue

我正在阅读 LinkedBlockingQueue 代码 (JDK8u),我发现 LinkedBlockingQueue 的头部字段不是私有(private)的,但最后一个字段是私有(private)的。我找不到 head 的任何特定操作。那么为什么不将 head 设置为 private 呢?

/**
 * 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;

最佳答案

首先是一些事实。

  1. 在 Java 6 中,head 字段是private
  2. 到 Java 17,head 字段是包私有(private)的……并且它有关于不变量的注释。
  3. 变化实际上发生在 Java 8 中。

那么为什么他们改变了它?

到目前为止我还没有弄清楚,但可能的原因可能包括:

  • 这样子类(在同一个包中)就可以访问该字段,尽管我在已发布的代码库中看不到任何此类类。
  • 为了更容易测试类(class)。 (这不是进行此更改的理由,而且我看不到任何证据表明这是原因。)
  • 这是与内部类相关的“个人风格”,虽然我不相信。 (为什么只为 head 做?为什么不为 tail 也做?)
  • 这是偶然发生的。

在 Github 上花了 20 分钟查看历史记录后,我认为这可能是一个意外。根据“git blame”,更改似乎发生在此提交(https://github.com/openjdk/jdk8u/commit/6f31fa54ac050d781656d6e8ed18a40b55ef5c0d)中......但是当我查看提交中的内容时,我根本看不到更改,更不用说目的了1。这令人费解。

也许在Mercurial的历史上更清楚2

无论如何,这整件事都是对好奇心的锻炼。他们更改它的原因并不重要,也不会影响他们所做的任何用户代码3


1 - 变更集描述表明它只是与 java.util.concurrent 类的原始/主要作者维护的私有(private)存储库同步。
2 - 我们正在寻找最终 Mercurial 存储库的只读 Git 镜像。有可能在创建镜像的过程中搞砸了。
3 - ... 与用户代码中已存在的 Heisenbug 的模交互。

关于java - 为什么 LinkedBlockingQueue 的头部不是私有(private)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70443248/

相关文章:

java - 使用 ArrayBlockingQueue 会使进程变慢

java - 如何通过 ThreadExecutor 实现带有自定义比较器的 BlockingQueue?

Java点对点线程模型,大家等待Job

java - LinkedBlockingQueue 在生产者-消费者场景中具有许多生产者的线程安全性

java - 生成小的 ascii 字符串列表

java - 如何使用正则表达式允许连字符

java - 使用类构造函数设置数组值时出现 NullPointerException

java - 对于阻塞集合中的每个

java - 在 Struts2 中访问多键映射

java - 回文中的for循环