TOP
0
0
【簡體曬書區】 單本79折,5本7折,活動好評延長至5/31,趕緊把握這一波!
Java併發編程之美(簡體書)
滿額折
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)
Java併發編程之美(簡體書)

Java併發編程之美(簡體書)

人民幣定價:89 元
定  價:NT$ 534 元
優惠價:87465
領券後再享88折
海外經銷商無庫存,到貨日平均30天至45天
可得紅利積點:13 點
相關商品
商品簡介
作者簡介
目次

商品簡介

併發編程相比 Java 中其他知識點的學習門檻較高,從而導致很多人望而卻步。但無論是職場面試,還是高併發/ 高流量系統的實現,卻都離不開併發編程,於是能夠真正掌握併發編程的人成為了市場迫切需求的人才。本書通過圖文結合、通俗易懂的講解方式幫助大家完成多線程併發編程從入門到實踐的飛躍!全書分為三部分,第一部分為Java 併發編程基礎篇,主要講解Java 併發編程的基礎知識、線程有關的知識和併發編程中的其他相關概念,這些知識在高級篇都會有所使用,掌握了本篇的內容,就為學習高級篇奠定了基礎;第二部分為Java 併發編程高級篇,講解了Java 並發包中核心組件的實現原理,讓讀者知其然,也知其所以然,熟練掌握本篇內容,對我們在日常開發高併發、高流量的系統時會大有裨益;第三部分為Java 併發編程實踐篇,主要講解併發組件的使用方法,以及在使用過程中容易遇到的問題和解決方法。

作者簡介

翟陸續,花名加多,四川大學計算機學院研究生畢業。目前任淘寶技術高級開發工程師,熱衷於Java併發編程,對JUC包源碼有深入的研究,熟悉常用開源框架實現原理。
薛賓田,四川大學計算機學院研究生畢業,阿裡巴巴原研發工程師,目前在河南牧業經濟學院信息工程學院擔任Java課程老師。

前 言
本書特色
不像其他併發類書籍那樣晦澀難懂,本書的特色之一是通俗易懂,對Java 有一定基礎的開發人員都可以看懂。本書在基礎篇專門講解併發編程基礎,筆者根據在項目實踐中對這些知識的理解,總結了併發編程中常用的基礎知識以及常用的概念,並通過圖文結合的方式降低理解的難度,使用少量的代碼講解就可以讓讀者輕鬆掌握併發編程的基礎知識,讓讀者逐步建立起自信。在高級篇主要講解JUC 並發包下併發組件的實現原理,首先介紹JUC 裡面最簡單的原子類,讓讀者學會使用在基礎篇裡介紹的最簡單的CAS 操作,再逐步加大難度讓讀者慢慢適應:比如一開始打算把併發List 放到鎖後面講解,因為併發List 裡面使用了鎖,但是鎖的理解難度比List 大太多,所以最終還是堅持從易入難的原則,先講解List,再講解鎖。在實踐篇中首先講解併發組件在開源框架或者項目中的運用,讓讀者不僅可以知道併發組件的原理,而且可以瞭解怎麼使用這些組件。最後總結筆者在項目中或者其他同事在項目中經常遇到的併發編程問題,並對其進行分析,給出解決方案。
如果你只想使用並發包,那麼可以閱讀本書,因為本書在講解代碼時基本都是用的實例;如果你想研究源碼卻一籌莫展――不知道如何下手或者感覺吃力,也可以閱讀本書,因為本書對核心代碼進行了講解;如果你想瞭解併發編程中的常見問題,增加對併發的認識,也可以閱讀本書,因為本書對這類問題進行了總結。

如何閱讀本書
本書分為基礎篇、高級篇和實踐篇,其中基礎篇講解線程的知識和併發編程中的基本概念以及基礎知識,高級篇則介紹並發包下常用的併發組件的原理,實踐篇講解併發組件的具體使用方法和在併發編程中會遇到的一些併發問題及解決方法。
閱讀開源框架源碼的一點心得
為什麼要看源碼
我們在做項目的時候一般會遇到下面的問題:
(1)不知道如何去設計。比如剛入職場時,來一個需求需做概要設計,不知如何下手,不得不去看當前系統類似需求是如何設計的,然後仿照去設計。
(2)設計的時候,考慮問題不周全。相比職場新手,這類人對一個需求依靠自己的經驗已經能夠拿出一個概要設計,但是設計中經常會遺漏一些異常細節,比如使用多線程有界隊列執行任務,遇到機器宕機了,如果隊列裡面的任務不存盤的話,那麼機器下次啟動的時候這些任務就丟失了。
對於這些問題,說到底主要還是因為經驗不夠,而經驗主要從項目實踐中積累,所以招聘單位一般都會限定工作時間大於 3 年,因為這些人的項目經驗相對較豐富,在項目中遇到的場景相對較多。工作經驗的積累來自於年限與實踐,然而看源碼可以擴展我們的思路,這是變相增加我們經驗的不錯方法。雖然不能在短時間內通過時間積累經驗,但是可以通過學習開源框架、開源項目來獲取經驗。
另外,進職場後一般都要先熟悉現有系統,如果有文檔還好,沒文檔的話就得自己去翻代碼研究。如果之前對閱讀源碼有經驗,那麼在研究新系統的代碼邏輯時就不會那麼費勁了。
還有一點就是,當你使用框架或者工具做開發時,如果你對它的實現有所瞭解,就能最大化地減少出故障的可能。比如併發隊列 ArrayBlockingQueue 裡面關於元素入隊有個offer 方法 和 put 方法,雖然某個時間點你知道使用 offer 方法時,當隊列滿了就會丟棄要入隊的元素,之後 offer 方法會返回 false,而不會阻塞當前線程;而使用 put 方法時,當隊列滿了,則會掛起當前線程,直到隊列有空閒,元素入隊成功後才返回。但是人是善忘的,一段時間不使用,就會忘記它們的區別,當你再去使用時,需進入 offer 和 put 方法的內部,看它們的源碼實現。進入 offer 方法一看,哦,原來隊列滿後直接返回了 false ;進入 put方法一看,哦,原來隊列滿後,直接使用條件變量的 await 方法掛起了當前線程。知道了它們的區別,你就可以根據自己的需求來選擇了。看源碼最大的好處是可以開闊思維,提升架構設計能力。有些東西僅靠書本和自己思考是很難學到的,必須通過看源碼,看別人如何設計,然後思考為何這樣設計才能領悟到。
能力的提高不在於你寫了多少代碼,做了多少項目,而在於給你一個業務場景時,你是否能拿出幾種靠譜的解決方案,並且說出各自的優缺點。而如何才能拿出來,一來靠經驗,二來靠歸納總結,而看源碼可以快速增加你的經驗。

如何看源碼
那麼如何閱讀源碼呢?在你看某一個框架的源碼前,先去 Google 查找這個開源框架的官方介紹,通過資料瞭解該框架有幾個模塊,各個模塊是做什麼的,之間有什麼聯繫,每個模塊都有哪些核心類,在閱讀源碼時可以著重看這些類。
然後對哪個模塊感興趣就去寫個小 demo,先瞭解一下這個模塊的具體作用,然後再debug 進入看具體實現。在 debug 的過程中,第一遍是走馬觀花,簡略看一下調用邏輯,都用了哪些類;第二遍需有重點地 debug,看看這些類擔任了架構圖裡的哪些功能,使用了哪些設計模式。如果第二遍有感覺了,便大致知道了整體代碼的功能實現,但是對整體代碼結構還不是很清晰,畢竟代碼裡面多個類來回調用,很容易遺忘當前斷點的來處;那麼你可以進行第三遍 debug,這時候你最好把主要類的調用時序圖以及類圖結構畫出來,等畫好後,再對著時序圖分析調用流程,就可以清楚地知道類之間的調用關係,而通過類圖可以知道類的功能以及它們相互之間的依賴關係。
另外,開源框架裡面每個功能類或者方法一般都有注釋,這些注釋是一手資料,比如JUC 包裡的一些併發組件的注釋,就已經說明了它們的設計原理和使用場景。在閱讀源碼時,最好畫出時序圖和類圖,因為人總是善忘的。如果隔一段時間你再去看之前看過的源碼,雖然有些印象,但當你想去看某個模塊的邏輯時,又需根據 demo 再從頭 debug 了。而如果有了這倆圖,就可以從這倆圖裡面直接找,並且看一眼時序圖就知道整個模塊的脈絡了。
此外,查框架使用說明最好去官網查(這些信息是源頭,是沒有經過別人翻譯的),雖然是英文,但是看久了就好了,畢竟還有 Google 翻譯呐!當然研究代碼時不一定非要 debug 三遍,其實這裡說的是三種掌握程度,如果你
debug 一遍就能掌握,那自然更好啦。

目次

第一部分 Java 併發編程基礎篇
第1 章 併發編程線程基礎 / 2
1.1 什麼是線程 / 2
1.2 線程創建與運行 / 3
1.3 線程通知與等待 / 6
1.4 等待線程執行終止的join 方法 / 16
1.5 讓線程睡眠的sleep 方法 / 19
1.6 讓出CPU 執行權的yield 方法 / 24
1.8 理解線程上下文切換 / 30
1.9 線程死鎖 / 30
1.9.1 什麼是線程死鎖 / 30
1.9.2 如何避免線程死鎖 / 33
1.10 守護線程與用戶線程 / 35
1.11 ThreadLocal / 39
1.11.1 ThreadLocal 使用示例 / 40
1.11.2 ThreadLocal 的實現原理 / 42
1.11.3 ThreadLocal 不支持繼承性 / 45
1.11.4 InheritableThreadLocal 類 / 46
第2 章 併發編程的其他基礎知識 / 50
2.1 什麼是多線程併發編程 / 50
2.2 為什麼要進行多線程併發編程 / 51
2.3 Java 中的線程安全問題 / 51
2.4 Java 中共享變量的內存可見性問題 / 52
2.5 Java 中的synchronized 關鍵字 / 54
2.5.1 synchronized 關鍵字介紹 / 54
2.5.2 synchronized 的內存語義 / 55
2.6 Java 中的volatile 關鍵字 / 55
2.7 Java 中的原子性操作 / 57
2.8 Java 中的CAS 操作 / 59
2.9 Unsafe 類 / 59
2.9.1 Unsafe 類中的重要方法 / 59
2.9.2 如何使用Unsafe 類 / 61
2.10 Java 指令重排序 / 65
2.11 偽共享 / 67
2.11.1 什麼是偽共享 / 67
2.11.2 為何會出現偽共享 / 68
2.11.3 如何避免偽共享 / 70
2.11.4 小結 / 72
2.12 鎖的概述 / 72
2.12.1 樂觀鎖與悲觀鎖 / 72
2.12.2 公平鎖與非公平鎖 / 75
2.12.3 獨佔鎖與共享鎖 / 75
2.12.4 什麼是可重入鎖 / 76
2.12.5 自旋鎖 / 77
2.13 總結 / 77
第二部分 Java 併發編程高級篇
第3 章 Java 並發包中ThreadLocalRandom 類原理剖析 / 80
3.1 Random 類及其局限性 / 80
3.2 ThreadLocalRandom / 82
3.3 源碼分析 / 84
3.4 總結 / 87
第4 章 Java 並發包中原子操作類原理剖析
4.1 原子變量操作類 / 88
4.2 JDK 8 新增的原子操作類LongAdder / 93
4.2.1 LongAdder 簡單介紹 / 93
4.2.2 LongAdder 代碼分析 / 95
4.2.3 小結 / 101
4.3 LongAccumulator 類原理探究 / 102
4.4 總結 / 104
第5 章 Java 並發包中併發List 源碼剖析 / 105
5.1 介紹 / 105
5.2 主要方法源碼解析 / 106
5.2.1 初始化 / 106
5.2.2 添加元素 / 106
5.2.3 獲取指定位置元素 / 108
5.2.4 修改指定元素 / 109
5.2.5 刪除元素 / 110
5.2.6 弱一致性的迭代器 / 111
5.3 總結 / 114
第6 章 Java 並發包中鎖原理剖析 / 115
6.1 LockSupport 工具類 / 115
6.2 抽象同步隊列AQS 概述 / 122
6.2.1 AQS――鎖的底層支持 / 122
6.2.2 AQS――條件變量的支持 / 128
6.2.3 基於AQS 實現自定義同步器 / 131
6.3 獨佔鎖ReentrantLock 的原理 / 136
6.3.1 類圖結構 / 136
6.3.2 獲取鎖 / 137
6.3.3 釋放鎖 / 142
6.3.4 案例介紹 / 143
6.3.5 小結 / 145
6.4 讀寫鎖ReentrantReadWriteLock 的原理 / 145
6.4.1 類圖結構 / 145
6.4.2 寫鎖的獲取與釋放 / 147
6.4.3 讀鎖的獲取與釋放 / 151
6.4.5 小結 / 158
6.5 JDK 8 中新增的StampedLock 鎖探究 / 158
6.5.1 概述 / 158
6.5.2 案例介紹 / 160
6.5.3 小結 / 164
第7 章 Java 並發包中併發隊列原理剖析 / 165
7.1 ConcurrentLinkedQueue 原理探究 / 165
7.1.1 類圖結構 / 165
7.1.2 ConcurrentLinkedQueue 原理介紹 / 166
7.1.3 小結 / 181
7.2 LinkedBlockingQueue 原理探究 / 182
7.2.1 類圖結構 / 182
7.2.2 LinkedBlockingQueue 原理介紹 / 185
7.2.3 小結 / 194
7.3 ArrayBlockingQueue 原理探究 / 195
7.3.1 類圖結構 / 195
7.3.2 ArrayBlockingQueue 原理介紹 / 197
7.3.3 小結 / 202
7.4 PriorityBlockingQueue 原理探究 / 203
7.4.1 介紹 / 203
7.4.2 PriorityBlockingQueue 類圖結構 / 203
7.4.3 原理介紹 / 205
7.4.4 案例介紹 / 214
7.4.5 小結 / 216
7.5 DelayQueue 原理探究 / 217
7.5.1 DelayQueue 類圖結構 / 217
7.5.2 主要函數原理講解 / 219
7.5.3 案例介紹 / 222
7.5.4 小結 / 224
第8 章 Java 並發包中線程池ThreadPoolExecutor 原理探究 / 225
8.1 介紹 / 225
8.2 類圖介紹 / 225
8.3 源碼分析 / 230
8.3.1 public void execute(Runnable command) / 230
8.3.2 工作線程Worker 的執行 / 235
8.3.3 shutdown 操作 / 238
8.3.4 shutdownNow 操作 / 240
8.3.5 awaitTermination 操作 / 241
8.4 總結 / 242
第9 章 Java 並發包中ScheduledThreadPoolExecutor 原理探究 / 243
9.1 介紹 / 243
9.2 類圖介紹 / 243
9.3 原理剖析 / 245
9.3.1 schedule(Runnable command, long delay,TimeUnit unit) 方法 / .246
9.3.2 scheduleWithFixedDelay(Runnable command,long initialDelay, long delay,
TimeUnit unit) 方法 / 252
9.3.3 scheduleAtFixedRate(Runnable command,long initialDelay,long period,
TimeUnit unit) 方法 / 254
9.4 總結 / 255
第10 章 Java 並發包中線程同步器原理剖析 / 256
10.1 CountDownLatch 原理剖析 / 256
10.1.1 案例介紹 / 256
10.1.2實現原理探究/259
10.1.3小結/263
10.2回環屏障CyclicBarrier原理探究/264
10.2.1案例介紹/264
10.2.2實現原理探究/268
10.2.3小結/272
11.1ArrayBlockingQueue的使用/284
11.1.1異步日誌打印模型概述/284
11.1.2異步日誌與具體實現/285
11.1.3小結/293
11.2Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用/293
11.2.1生產者――Acceptor線程/294
11.2.2消費者――Poller線程/298
11.2.3小結/300
11.3併發組件ConcurrentHashMap使用注意事項/300
11.4SimpleDateFormat是線程不安全的/304
11.4.1問題複現/304
11.4.2問題分析/305
11.4.3小結/309
11.5使用Timer時需要注意的事情/309
11.5.1問題的產生/309
11.5.2Timer實現原理分析/310
11.5.3小結/313
11.6對需要複用但是會被下游修改的參數要進行深複製/314
11.6.1問題的產生/314
11.6.2問題分析/316
11.6.3小結/318
11.7創建線程和線程池時要指定與業務相關的名稱/319
11.7.1創建線程需要有線程名/319
11.7.2創建線程池時也需要指定線程池的名稱/321
11.7.3小結/325
11.8使用線程池的情況下當程序結束時記得調用shutdown關閉線程池/

您曾經瀏覽過的商品

購物須知

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

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

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

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

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

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

暢銷榜

客服中心

收藏

會員專區