TOP
月月讀書金,登入即領,滿600現折50!!
Java高併發與集合框架:JCF和JUC源碼分析與實現(簡體書)
滿額折

Java高併發與集合框架:JCF和JUC源碼分析與實現(簡體書)

商品資訊

人民幣定價:119 元
定價
:NT$ 714 元
優惠價
87621
海外經銷商無庫存,到貨日平均30天至45天
下單可得紅利積點 :18 點
商品簡介
作者簡介
名人推薦
目次

商品簡介

本書主要對Java集合框架(JCF)和Java並發工具包(JUC)進行介紹,包括它們的適用場景、使用方法、技術理論和運行原理。為了讓讀者能夠輕鬆閱讀本書,本書中所有內容都採用由淺入深的方式進行介紹,先保證讀者會用這些技術,再介紹這些技術的運行原理。
本書分為3部分,第1部分為Java編程入門知識,方便初學者對JCF相關知識進行查漏補缺,第2 部分和第3部分對基礎知識有一定的要求,適合有一些Java編程基礎的技術人員閱讀。

 

作者簡介

銀文杰
筆名“說好不能打臉”,CSDN專欄作者,CSDN Java特約編輯,《高性能服務系統構建與實戰》一書作者。16年資深IT“直男”一枚,愛好是敲敲代碼、寫寫博客、研究創業熱點。
參與過多個百萬級用戶系統的設計研發,對系統頂層設計、技術線路規劃、系統性能調優、業務抽象等有較豐富的經驗。也曾有幾年頭腦發熱拍案創業,兼職過市場銷售、電話客服、公司保安及清潔大叔。

名人推薦

1.本書主要對Java集合框架(JCF)和Java並發工具包(JUC)進行介紹,包括它們的適用場景、使用方法、技術理論和運行原理。
2.根據二八法則,掌握Java集合框架和Java並發工具包,輕鬆應對80%的工作場景。
3.本書思路清晰、由淺入深、通俗易懂、講解細致,幫助讀者輕鬆掌握相關知識點。

前言

1.寫在開篇
為什麼撰寫本書
筆者一直在信息系統建設的一線工作,承擔過多種不同的工作職責。在工作中,筆者經常和掌握不同技術的朋友討論具體問題的解決方案,發現在Java體系中,大家使用多的是Java集合框架(JCF)和Java並發工具包(JUC)。實際上,JCF和JUC已經能夠覆蓋筆者及朋友們工作中遇到的超過8成的應用場景,但是大家往往無法快速匹配合適的技術方案。此外,在JCF和JUC中存在大量可以在實際工作中借鑒的設計方案,雖然網絡上有一些零散的關於集合的介紹,但深入講解其工作原理的內容並不多,甚至有一些資料存在質量問題。
筆者“擼碼”近17年,慶幸頭未禿、智未衰。於是筆者在1年前產生了這樣的想法,希望將自己在實際工作中梳理、總結的JCF、JUC的相關知識成體系地介紹給大家,也希望將自己在閱讀JDK源碼(包括JCF、JUC、I/O、NET等模塊)後總結和思考的可用於實際工作的技術手段成體系地分享給大家。
有了想法,便著手行動,經過大半年的整理、撰寫、調整,終成本書。因個人水平有限,書中難免有錯誤和疏漏之處,希望各位讀者能誠意指出、不吝賜教。此外,各位讀者可以直接通過筆者的郵箱yin-wen-jie@163.com聯繫筆者本人。
關於本書選擇的JDK版本
由於JDK版本迭代速度較快,本書的整理和撰寫又需要一個較長的時間,並且書中內容包括大量源碼分析和講解,因此本書首先要解決的問題,就是選定一個本書進行源碼講解和分析所依據的JDK版本。
這個問題需要從JDK版本的更新特點、大家使用JDK版本的習慣和撰寫本書的目的來考慮,目前大家在實際工作中使用多的版本是JDK 1.8和JDK 11,並且出於對Oracle商業運作的考慮,JDK 11之後的升級版本已不再免費提供,因此大家在生產環境中一般使用Open JDK作為運行環境。同樣出於對Oracle商業運作的考慮,JDK版本的發布周期固定為每半年發布一個大版本、每3年發布一個LTS/LMS版本(長期支持版本),截至2021年4月,JDK 16已經發布(JDK 16是一個短期過渡版本),緊接著2021年9月,JDK 17正式發布(這是一個LTS/LMS版本),這顯然加大了讀者學習和篩選JDK版本的工作量。
好消息是Oracle基本開源了所有已成熟的JDK版本,是否商業化運行並不會影響我們對這些JDK源碼的學習(只要不用於商業用途),而且JDK版本的向下兼容性保證了讀者在了解JDK的工作原理後,可以將其應用到自己正在使用的JDK版本上。此外,越新的JDK版本對關鍵數據結構、關鍵算法實現過程的優化越多,本書希望在講解過程中,可以盡可能多地將這些有益的優化點介紹給讀者。
在綜合考慮各因素後,本書將JDK 14作為本書講解源碼依據的主要版本(在後續內容中,如果不特別說明,那麼代碼分析都是基於JDK 14進行的)。JDK 14是在整理、編寫本書時發布的版本。在該版本中,與本書主要內容有關的數據結構、核心算法、設計方案和之前的版本基本保持穩定和兼容,便於讀者在常用的JDK 1.8、JDK 11中找到對應的實現位置。本書介紹的JDK 14中的源碼內容是完全開源的,讀者可以在Oracle官方網站直接下載這些源碼。
本書的目標讀者
本書前半部分可以作為Java編程的入門學習內容,也可以作為初學者進行JCF部分知識查漏補缺的參考資料;本書後半部分對基礎知識有一定的要求,適合有一些Java編程基礎的程序員閱讀。此外,本書可以作為程序員對JCF部分和JUC部分知識結構進行梳理的參考用書。
2.本書約定
1)關於源碼注釋及代碼格式。
本書中有大量基於JDK 14的源碼片段。筆者會對這些源碼片段逐段說明、逐條分析,讀者不用擔心無法讀懂這些源碼。此外,大部分章節在對源碼進行分析後,會使用圖文方式對源碼中的重要知識點進行歸納和總結。
引用大量的源碼會占用篇幅。為了盡可能節約紙張,本書中的示例代碼沒有遵循Java官方推薦的注釋規範和代碼格式規範,本書會對代碼和注釋進行格式壓縮。本書主要採用以下兩種格式壓縮方式。
? 採用單行注釋代替多行注釋。
Java官方推薦的多行注釋方式採用的是“__**/”,如下所示。
__*
* Creates a new, empty map with an initial table size
* accommodating the specified number of elements without the need
* to dynamically resize.
*
* @throws IllegalArgumentException if the initial capacity of
* elements is negative
*/
這種注釋方式非常清晰且容易閱讀,但是占用了過長的篇幅,所以本書會將上述注釋轉換為單行注釋,如下所示。
// Basic hash bin node, used for most entries.
// (See below for TreeNode subclass, and in LinkedHashMap for its Entry 
// subclass.)
? 採用壓縮格式替換單行代碼塊。
如果代碼塊中只有一行代碼,那麼Java允許省略代碼塊中的大括號“{}”。例如,在if語句的代碼塊中,如果只有一行執行代碼,則可以採用如下方式進行書寫。
if (c == 0)
result = v;
但這種書寫方式容易在排布緊湊的局部位置引起閱讀障礙,所以針對源碼中的這種簡寫方式,本書進行了簡寫還原和格式壓縮。書中會恢復所有被簡寫的代碼段落的大括號“{}”,從而方便對源碼進行分析,並且將只有一行代碼的代碼塊壓縮成單行,如下所示。
if (s == elementData.length) {
elementData = grow();
}
// 或者
if (s == elementData.length) { elementData = grow(); }
2)關於JDK版本的命名。
JDK 1.2~JDK 1.8都採用1.X格式的小版本號,但是在JDK 1.8後,Oracle改為採用大版本號對其進行命名,如JDK 9、JDK 11等。本書也會採用這種命名方式,但是由於各個版本功能存在差異,因此為了表達從某個JDK版本開始支持某種功能或特性,本書會採用“ ”符號表示。例如,如果要表達從JDK 1.8開始支持某種特性,則用JDK 1.8 表示;如果要表達從JDK 11開始支持某種特性,則用JDK 11 表示。
3)其他約定。
? 關於JVM的稱呼約定。
本書無意深入分析JVM的內部運行原理,也不會深入討論JVM每個模塊負責的具體工作。例如,本書不會分析JIT(實時編譯器)指令重排的細節,以及在什麼情況下代碼指令不會被編譯執行,而會被解釋執行。凡是涉及內部運行原理的內容,本書將其統稱為JVM運行過程。此外,如果沒有特別說明,那麼本書提到的JVM都表示HotSpot版本的虛擬機。
? 關於方法的稱呼約定。
由於Java中的方法涉及多態場景,因此本書需要保證對Java中方法的稱呼不出現二義性。例如,java.lang.Object類中的wait()方法存在多態表達,代碼如下。
wait() throws InterruptedException

wait(long timeoutMillis) throws InterruptedException

wait(long timeoutMillis, int nanos) throws InterruptedException
在不產生二義性的情況下,本書會直接採用“wait()方法”的描述方式。如果需要介紹多態場景中方法名相同、入參不同的方法表達的不同工作特性,那麼不加區別就會造成二義性,這時本書會採用“wait()”“wait(long)”分別進行特定描述。
? 關於圖表的約定。
本書主要採用圖文方式對Java源碼進行說明、分析和總結,由於客觀限制,大量的插圖只能採用黑白方式呈現,因此如果有需要,則會在插圖後的正文中或插圖右上角給出圖例說明。
? 關於System.out物件的使用。
在實際工作中,推薦使用slf4j-log4j方式進行日志/控制臺輸出,但本書中的代碼片段大量使用System.out物件進行控制臺輸出,這並不影響讀者理解這些代碼片段的邏輯,也有利於不同知識水平的讀者將精力集中在理解核心思路上。
? 關於包簡寫的約定。
本書大部分內容涉及Java集合框架(JCF)和Java並發工具包(JUC),JCF和JUC通常涉及較長的包路徑。例如,在JUC中,封裝後終向程序員開放的原子性操作工具類位於java.util.concurrent.atomic包下。如果本書中每一個類的全稱都攜帶這麼長的包路徑,那麼顯然是沒必要的。為了節約篇幅,本書會使用包路徑下每個路徑點的首字母對包路徑進行簡寫,如將“java.util.concurrent.atomic”包簡寫為j.u.c.atomic包。
? 關於集合、集合物件、隊列的約定。
讀者應該都已經知曉,物件是類的實例。本書將JCF中的具體類稱為集合,將JCF中類的實例物件稱為集合物件。隊列是一種具有特定工作效果的集合,從繼承結構上來說,本書會將JCF中實現了java.util.Queue接口的集合稱為隊列。這主要是為了表述方便,並不代表筆者認為集合、集合物件和隊列在JVM工作原理層面上有任何差異。
3.必要的前置知識
本書難度適中,但仍然需要讀者對Java編程語言具備基本認知,這樣才能通暢地閱讀本書所有內容。這種基本認知與工作年限沒有關係,屬於只要是Java程序員就應該掌握的知識。
1)關於位運算的知識。
Java支持基於二進制的位運算操作。在Java中,使用“>>”表示無符號位的右移運算,使用“>>>”表示有符號位的右移運算,使用“<<”表示無符號位的左移運算,使用“<<<”表示有符號位的左移運算。
在Java中,基於整數的位運算相當於整數的乘法運算或除法運算。如“x >> 1”表示將x除以2,“x << 1”表示將x乘以2。在JCF中,無論是哪個版本的Java源碼,都會採用位運算來實現整數與2的乘法運算或除法運算。此外,讀者需要知道如何對某個負整數進行二進制表達。在特定情況下,Java使用與運算替換取余運算。例如,通過語句“x & 255”可實現取余運算,這句代碼的意義為對256取余。
2)關於物件引用、引用傳遞和“相等”的知識。
Java中有八種基礎類型和類類型,可以使用引用的方式給類的物件賦值。在調用方法時,除八種基礎類型的變量外,傳遞的都是物件引用(包括基於基礎類型的數組物件)。
Java中的“相等”有兩種含義,一種是值相等,另一種是引用地址相等。值相等是由物件中的 equals()方法和 hashCode()方法配合實現的(如果兩個物件的值相等,那麼使用equals()方法對這兩個物件進行比較會返回true,並且使用hashCode()方法對這兩個物件進行比較返回的int類型的值也必然相同);引用地址相等是由兩個物件(注意:不是基本類型數據)使用“==”運算符進行比較得到的。
本書雖然未涉及動態常量池、字符串常量池的相關知識,但需要讀者知曉這些,否則無法理解類似於“String”的字符串物件或基礎類型裝箱後的物件關於“相等”的工作原理。
3)關於物件序列化和反序列化的知識。
Java的序列化和反序列化過程主要是指由java.io包支持的將物件轉換為字節序列並輸出的過程和將字節序列轉換為物件並輸入的過程。JCF 中的大部分集合都對物件的序列化和反序列化過程進行了重新實現。其中要解決的問題有很多,包括提高各種集合在序列化和反序列化過程中的性能問題(這個很關鍵,因為集合中通常存儲了大量數據),以及如何保證集合在不同JDK版本中進行反序列化時的兼容性問題。
本書不會專門講解每一種集合在序列化和反序列化過程中的工作細節,以及如何解決上述問題,並且默認讀者知曉 Java 中的物件可以使用 writeObject(ObjectOutputStream)方法和readObject(ObjectInputStream)方法對序列化和反序列化過程進行干預。
4)關於線程的知識。
為了介紹在高並發場景中工作的集合,本書會先介紹Java並發工具包(JUC)中的相關知識點,所以讀者需要知道Java中的基本線程使用方法,如如何創建和運行一個用戶線程。
5)關於原子性操作的基礎知識。
在閱讀本書前,讀者無須知道引起原子性操作問題的底層原因,但需要知道Java並不能保證所有場景中的原子性操作。例如,在多線程情況下,如果沒有施加任何安全措施,那麼Java無法保證類似於“i ”語句的原子性。
4.本書的知識結構和脈絡
由於JCF和JUC有非常龐大的知識體系,因此無法用有限的篇幅覆蓋所有知識點。例如,本書並未講解JCF中的每種集合對fail-fast機制的匹配設計,也沒有講解每種集合對物件序列化和反序列化的優化設計。此外,即使要講解指定範圍內的知識點,也需要有清晰的思路和知識脈絡,從而幫助讀者更好地理解。因此,在正式閱讀本書內容前,需要了解本書內容的介紹路徑。
首先,本書會介紹基礎的集合,它們都屬於 JCF 的知識範疇,分別屬於List、Queue、Map和Set性質的集合,並且與JUC不存在使用場景交集。在這一部分,本書會介紹這些集合的基本工作原理(這些集合的外在功能表現各不相同,但它們的內在數據結構具備共性),並且選擇其中的重要集合及其數據結構來詳細講解。
然後,本書會向在高並發場景中工作的集合進行過渡,在這一部分,本書的內容難度有所提升,所以在正式介紹這些集合前,會先介紹與之有關的高並發知識。例如,在高並發場景中如何保證原子性、可見性和有序性,Java中兩種管程的工作原理和使用方法,Java為什麼需要通過自行實現的管程技術解決多線程問題。實際上,這些都是JUC的相關知識。
後,本書會介紹在高並發場景中使用的集合,這些集合主要負責兩類任務,一類任務是在高並發場景中正確完成數據的存儲工作並為多個線程分享數據,另一類任務是在高並發場景中主導消費者線程(從集合中讀取數據的線程)和生產者線程(向集合中寫入數據的線程)之間的數據傳輸工作。這部分主要介紹Queue/Deque集合,以及它們是如何在保證線程安全性的前提下,利用各種設計技巧提高工作效率的。
根據本書的知識邏輯,讀者會從JCF部分的知識脈絡過渡到JUC部分的知識脈絡,後回到JCF本身,其中涉及的集合和數據結構如圖0-2所示。需要注意的是,本書不會對所有集合和數據結構進行詳細講解,而是有選擇地進行詳細講解。例如,HashMap集合具有代表性,所以會對其進行詳細講解,然後在此基礎上說明LinkedHashMap集合是如何對前者進行結構擴展的;對於HashSet集合,雖然該集合經常在工作中使用,但其工作原理依賴於HashMap集合,所以只會對其進行粗略講解;為了讓讀者清晰理解那些適合工作在高並發場景中的集合是如何工作的,本書除了介紹Java中的兩種管程技術、多線程中的三性問題等知識,還會詳細介紹具有工作共性的數據結構(如堆、紅黑樹、數組、鏈表等),使讀者能在高並發場景中結合數據結構進行思考和理解。

 

目次

目錄


第I部分 Java集合框架 1
第1章 JCF中的List集合 3
1.1 List集合概要和重要接口介紹 3
1.1.1 java.lang.Iterable接口 4
1.1.2 java.util.Collection接口 5
1.1.3 java.util.AbstractList抽象類 6
1.1.4 java.util.RandomAccess接口 7
1.2 List集合實現——Vector 14
1.2.1 Vector集合的擴容操作 16
1.2.2 Vector集合的修改方法——set(int, E) 19
1.2.3 Vector集合的刪除方法——removeElementAt(int) 20
1.3 List集合實現——ArrayList 22
1.3.1 ArrayList集合概述 23
1.3.2 ArrayList集合的初始化操作和擴容操作 23
1.3.3 ArrayList集合中的add(E)方法 26
1.3.4 Vector集合與ArrayList集合對比 28
1.4 List集合實現——Stack 29
1.5 List集合實現——LinkedList 32
1.5.1 LinkedList集合的主要結構 33
1.5.2 LinkedList集合的添加操作 35
1.5.3 LinkedList集合的移除操作 40
1.5.4 LinkedList集合的查找操作 44
1.5.5 使用LinkedList集合的棧工作特性 46
1.6 LinkedList集合與ArrayList集合的對比 48
1.6.1 兩種集合寫操作性能的比較 48
1.6.2 兩種集合讀操作性能的比較 49
1.6.3 不同遍歷方式對LinkedList集合的意義 50
1.6.4 在什麼場景中推薦選擇LinkedList集合 54
第2章 JCF中的Queue、Deque集合 55
2.1 Queue集合實現——ArrayDeque 56
2.1.1 ArrayDeque集合的主要結構及相關方法 57
2.1.2 ArrayDeque集合的初始化過程 60
2.1.3 ArrayDeque集合的添加操作 61
2.1.4 ArrayDeque集合的擴容操作 64
2.2 堆和堆排序 67
2.2.1 樹、二叉樹 67
2.2.2 堆、小頂堆、大頂堆 69
2.2.3 堆的降維——使用數組表示堆結構 71
2.2.4 堆排序 72
2.2.5 自行完成一個堆排序 75
2.3 Queue集合實現——PriorityQueue 77
2.3.1 PriorityQueue隊列的基本使用方法 77
2.3.2 PriorityQueue隊列的構造 78
2.3.3 PriorityQueue隊列的核心工作原理 82
2.3.4 PriorityQueue隊列的擴容操作 88
2.3.5 PriorityQueue隊列的添加操作 90
2.3.6 PriorityQueue隊列的移除操作 90
第3章 JCF中的Map集合 94
3.1 Map集合概述 94
3.1.1 K-V鍵值對節點定義——Entry 95
3.1.2 與Map集合有關的重要接口和抽象類 97
3.2 紅黑樹略講 103
3.2.1 二叉查找樹(二叉搜索樹) 104
3.2.2 二叉查找樹的查找操作和添加操作 105
3.2.3 為什麼需要紅黑樹 107
3.2.4 紅黑樹的基本結構 107
3.2.5 紅黑樹的操作規則 108
3.2.6 紅黑樹的節點添加操作 110
3.2.7 紅黑樹的節點刪除操作 120
3.3 Map集合實現——TreeMap 136
3.3.1 TreeMap集合的基本使用方法 136
3.3.2 TreeMap集合的重要屬性和方法 138
3.4 Map集合實現——HashMap 148
3.4.1 HashMap集合的結構 150
3.4.2 HashMap集合的主要工作過程 155
3.4.3 向HashMap集合中添加K-V鍵值對節點(鏈表方式) 158
3.4.4 向HashMap集合中添加K-V鍵值對節點(紅黑樹方式) 160
3.4.5 HashMap集合紅黑樹、鏈表互相轉換 165
3.4.6 HashMap集合的擴容操作 172
3.5 Map集合實現——LinkedHashMap 180
3.5.1 LinkedHashMap集合的節點結構 182
3.5.2 LinkedHashMap集合的主要結構 184
3.5.3 LinkedHashMap集合的迭代器 186
第4章 JCF的Set集合 191
4.1 Set集合概述 192
4.1.1 java.util.SortedSet接口 192
4.1.2 java.util.NavigableSet接口 195
4.1.3 java.util.AbstractSet抽象類 199
4.2 Set集合實現——HashSet 200
4.2.1 HashSet集合的主要屬性 201
4.2.2 HashSet集合的構造方法 201
4.2.3 HashSet集合的主要操作方法 202
4.3 Set集合實現——LinkedHashSet、TreeSet 203
4.3.1 LinkedHashSet集合 203
4.3.2 TreeSet集合 204
第II部分 JUC與高並發概述 208
第5章 Object Monitor管程實現 212
5.1 悲觀鎖和樂觀鎖 212
5.2 synchronized修飾符和線程控制 215
5.2.1 線程的基本特點 215
5.2.2 線程狀態切換和操作方法 216
5.3 Object Monitor基本結構概要 227
5.3.1 synchronized修飾符和鎖升級過程 228
5.3.2 管程與synchronized修飾符 233
5.3.3 對線程狀態切換示意圖進行細化 235
5.4 使用jstack命令觀察線程狀態 237
5.4.1 jstack基本命令 237
5.4.2 jstack命令中的線程關鍵信息 238
5.4.3 線程狀態及切換方式(僅限Object Monitor模式) 240
5.5 Object Monitor模式總結 244
5.5.1 as-if-serial語義原則與happens-before規則 244
5.5.2 Object Monitor模式如何保證三性 246
5.5.3 Object Monitor模式如何解決互斥、同步問題 248
第6章 JUC的必要組成部分 250
6.1 Unsafe工具類 252
6.1.1 在源碼中使用Unsafe工具類 252
6.1.2 Unsafe工具類中的典型方法講解 255
6.2 LockSupport工具類 261
6.2.1 park()方法和unpark()方法的使用示例 261
6.2.2 LockSupport工具類的主要屬性和方法 263
6.3 線程狀態 266
6.3.1 使用jstack命令觀察線程狀態 266
6.3.2 更詳細的線程狀態說明 269
6.3.3 其他常用命令 271
6.4 volatile修飾符 275
6.4.1 為什麼需要Java內存模型 275
6.4.2 內存可見性問題和MESI協議 277
6.4.3 存儲緩存和失效隊列 281
6.4.4 內存屏障與數據一致性 283
6.4.5 內存屏障與指令重排 285
6.4.6 volatile修飾符和內存屏障 289
6.5 輕量化的原子性操作方法 300
6.5.1 原子性操作——AtomicInteger類 301
6.5.2 原子性操作——AtomicStampedReference類 301
6.5.3 使用變量句柄完成原子性操作 303
第7章 另一種管程實現——AQS技術 305
7.1 AQS技術的基本原理 306
7.1.1 AQS技術的工作過程概要及使用示例 306
7.1.2 AQS技術中的關鍵定義 308
7.2 AQS實現——ReentrantLock類 325
7.2.1 ReentrantLock類的使用方法 325
7.2.2 AQS技術如何幫助ReentrantLock類工作 327
7.3 AQS實現——Condition控制 332
7.3.1 基本使用方法 332
7.3.2 ReentrantLock類如何進行Condition控制 334
7.4 AQS技術總結 342
第III部分 在高並發場景中工作的集合 345
第8章 高並發場景中的List、Map和Set集合 346
8.1 List集合實現——CopyOnWriteArrayList 346
8.1.1 CopyOnWriteArrayList集合概述 346
8.1.2 CopyOnWriteArrayList集合的主要構造方法 348
8.1.3 CopyOnWriteArrayList集合的主要方法 349
8.1.4 java.util.Collections.synchronizedList()方法的補充作用 352
8.2 Map集合實現——ConcurrentHashMap 355
8.2.1 ConcurrentHashMap集合概述 355
8.2.2 ConcurrentHashMap集合的主要屬性 358
8.2.3 ConcurrentHashMap集合的主要工作過程 359
8.3 高並發場景中的List、Map、Set集合說明 378
第9章 高並發場景中的Queue集合 380
9.1 概述 380
9.1.1 什麼是有界隊列,什麼是無界隊列 381
9.1.2 什麼是阻塞隊列,什麼是非阻塞隊列 382
9.2 Queue集合實現——ArrayBlockingQueue 384
9.2.1 ArrayBlockingQueue隊列的基本使用方法 385
9.2.2 ArrayBlockingQueue隊列的工作原理 388
9.3 Queue集合實現——LinkedBlockingQueue 396
9.3.1 LinkedBlockingQueue隊列的重要屬性 397
9.3.2 LinkedBlockingQueue隊列的構造方法 399
9.3.3 入隊操作和出隊操作 401
9.3.4 LinkedBlockingQueue隊列的主要方法 404
9.4 Queue集合實現——LinkedTransferQueue 413
9.4.1 LinkedTransferQueue隊列的基本使用場景 414
9.4.2 LinkedTransferQueue隊列的主要結構 416
9.4.3 LinkedTransferQueue隊列的主要工作過程 420
9.4.4 LinkedTransferQueue隊列的主要方法 437
9.5 Queue集合實現——PriorityBlockingQueue 438
9.5.1 PriorityBlockingQueue隊列的主要屬性 439
9.5.2 PriorityBlockingQueue隊列的主要構造方法 440
9.5.3 PriorityBlockingQueue隊列的擴容過程 442
9.5.4 PriorityBlockingQueue隊列的典型操作方法 444
9.6 Queue集合實現——DelayQueue 446
9.6.1 java.util.concurrent.Delayed接口與基本使用方法 447
9.6.2 DelayQueue隊列的主要屬性和構造方法 449
9.6.3 DelayQueue隊列的主要工作過程 450
第10章 高並發場景中的集合總結 454
10.1 還有哪些高並發場景中的常用集合沒有被提及 454
10.2 典型集合對應關係對比 455
10.3 高並發場景中的集合可借鑒的設計思想 455
10.3.1 使用JUC提供的基本要素保證線程安全性 456
10.3.2 通過復合手段保證多場景中的性能平衡性 457
10.3.3 更多提升性能的手段 458

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 621
海外經銷商無庫存,到貨日平均30天至45天

暢銷榜

客服中心

收藏

會員專區