Java LongAdder扩展了哪个类?
在为LongAdder引用JavaDocs时,它扩展了Number类 然后,在查看源代码时,它是从Striped64扩展而来的 这让我很困惑,为什么我们不能在javadocs中指定从Striped64类扩展而来的LongAdder?Java LongAdder扩展了哪个类?,java,inheritance,java-8,Java,Inheritance,Java 8,在为LongAdder引用JavaDocs时,它扩展了Number类 然后,在查看源代码时,它是从Striped64扩展而来的 这让我很困惑,为什么我们不能在javadocs中指定从Striped64类扩展而来的LongAdder? 是因为条带64扩展了数字吗 他们可能正在扩展数字类长加法器,谁知道呢? 从Oracle文档: 可以得出结论,通过扩展
是因为条带64扩展了数字吗 他们可能正在扩展
数字
类长加法器
,谁知道呢?
从Oracle文档:
,使用
Q:为什么Striped64由LongAdder扩展?
A:Striped64
保存单元格的哈希表(其中每个单元格都是
AtomicLong
)。使用多个线程将值添加到
LongAdder
(它扩展了Striped64
),然后线程添加它们的值
到该哈希表中的不同单元格。这将导致并发线程
处理并提高吞吐量
可能是条带化的64是一个内部实现,他们希望它被抽象。
LongAdder扩展了哪个类
如源代码所示,它扩展了Striped64
。但是,由于该类不是公共API,Javadoc不会告诉您这一点
默认情况下,Javadoc只为
public
和protected
成员生成文档;换句话说,只有公共API被记录1。Striped64
类是包私有的,因此没有文档记录。由于该类没有文档化,因此找到了下一个最近的文档化祖先,在本例中正好是Number
。注意,您可以有一个有15个以上祖先的文档类Foo
,但是如果这些祖先都不是公共API,Javadoc将显示Foo扩展对象
从公共API和私有API的角度来看,LongAdder
扩展了Striped64
这一事实是不相关的。后一类是实现细节(即私有API)。公共API定义了库的契约;因此,在这种情况下,用户只关心LongAdder
是Number
的子类
如果需要,您可以配置Javadoc来记录所有内容,包括包private和private
成员。但是,生成的文档可能仅用于私人用途(例如,维护库的组织内部)
一,。API的公共性或私有性并不仅仅取决于可见性修饰符。该类所包含的包也是相关的。例如,JDK在带有前缀的包中有许多类,如
com.sun
、oracle
、JDK.internal
,等等。这些包中的类是私有API,因此没有在公开的Javadoc中记录
随着模块的出现,“私有包”的概念在Java9中获得了更正式的地位。现在,您可以显式声明哪些包由模块导出,这由运行时强制执行。因为
Striped64
不是公共API,而Number
是。另外一个重要的注意事项是,由于Striped64不是公共API,JavaSE的未来版本可以自由更改这种层次结构:LongAdder可以扩展一个完全不同的类,或者直接扩展Number。因此,java.util.concurrent.atomic包之外的任何以任何方式依赖Striped64存在的代码都是断开的代码;Striped64
非常好,以至于guava和其他一些项目不得不将其复制到它们的库代码中。类似地,StringBuilder
和StringBuffer
显示为扩展Object
,隐藏它们的公共、非公共基类AbstractStringBuilder
。