[英]Which class does LongAdder extends?
LongAdder擴展了哪個類?
如源代碼所示,它擴展了Striped64
。 但是,由於該類不是公共API,因此Javadoc不會告訴您。
默認情況下,Javadoc僅為public
成員和protected
成員生成文檔; 換句話說,只記錄了公共API 1 。 Striped64
類是包私有的,因此沒有記錄。 由於未記錄該類,因此找到了下一個最接近的文檔祖先,在這種情況下恰好是Number
。 請注意,您可以擁有一個有15個以上祖先的文檔類Foo
,但如果這些祖先都不是公共API,那么Javadoc將顯示Foo extends Object
。
從公共API與私有API的角度來看, LongAdder
擴展Striped64
的事實是無關緊要的。 后一類是實現細節 (即私有API)。 它是定義庫的合同的公共API; 因此,在這種情況下,用戶只關心LongAdder
是Number
的子類。
您可以配置Javadoc來記錄所有內容,包括package-private和private
成員(如果需要)。 但是,生成的文檔可能僅供私人使用(例如,維護庫的組織內部)。
1. API公開或私有的原因不僅僅是基於可見性修飾符。 該課程所包含的內容也是相關的。 例如,JDK在帶有前綴的包中有許多類,例如com.sun
, oracle
, jdk.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.