簡體   English   中英

LongAdder擴展了哪個類?

[英]Which class does LongAdder extends?

在為LongAdder引用JavaDocs時,它正在擴展Number類。

Java文檔LongAdder

然后在查看源代碼時,它從Striped64擴展而來

LongAdder源代碼

這對我來說很混亂,為什么我們不能在javadocs中指定從Striped64類擴展的LongAdder 是因為Striped64擴展了Number嗎?

LongAdder擴展了哪個類?

如源代碼所示,它擴展了Striped64 但是,由於該類不是公共API,因此Javadoc不會告訴您。


默認情況下,Javadoc僅為public成員和protected成員生成文檔; 換句話說,只記錄了公共API 1 Striped64類是包私有的,因此沒有記錄。 由於未記錄該類,因此找到了下一個最接近的文檔祖先,在這種情況下恰好是Number 請注意,您可以擁有一個有15個以上祖先的文檔類Foo ,但如果這些祖先都不是公共API,那么Javadoc將顯示Foo extends Object

從公共API與私有API的角度來看, LongAdder擴展Striped64的事實是無關緊要的。 后一類是實現細節 (即私有API)。 它是定義庫的合同的公共API; 因此,在這種情況下,用戶只關心LongAdderNumber的子類。

您可以配置Javadoc來記錄所有內容,包括package-private和private成員(如果需要)。 但是,生成的文檔可能僅供私人使用(例如,維護庫的組織內部)。


1. API公開或私有的原因不僅僅是基於可見性修飾符。 該課程所包含的內容也是相關的。 例如,JDK在帶有前綴的包中有許多類,例如com.sunoraclejdk.internal等。 這些包中的類是私有API,因此沒有在公共可用的Javadoc中記錄。

隨着模塊的出現,“私有包”的概念在Java 9中獲得了更多的官方地位。 現在,您可以顯式聲明模塊導出哪些包,這是由運行時強制執行的。

他們可能會 LongAdder 擴展 Number 誰知道呢?

來自Oracle Docs:

在此輸入圖像描述

在此輸入圖像描述

可以得出結論, LongAdder 通過擴展 Striped64 LongAdder 使用 AtomicLong

問:為什么Striped64由LongAdder擴展?

答: Striped64擁有Cells的哈希表(其中每個Cell是AtomicLong的變體)。 當多個線程用於向LongAdder (擴展Striped64 )添加值時,線程將其值添加到該哈希表中的不同單元格。 這導致並發線程處理並增加吞吐量。

可能是Striped64是一個內部實現,他們希望它被抽象化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM