-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Java多線程編程核心技術(第2版)

( 簡體 字)
作者:高洪巖 著類別:1. -> 程式設計 -> JAVA -> Java
譯者:
出版社:機械工業出版社Java多線程編程核心技術(第2版) 3dWoo書號: 51059
詢問書籍請說出此書號!

缺書
NT售價: 495

出版日:4/1/2019
頁數:440
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787111614906
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

本書是國內首本整本系統、完整地介紹Java多線程技術的書籍,作為筆者,我要感謝大家的支持與厚愛。

本書第1版在出版后獲得了廣大Java程序員與學習者的關注,技術論壇、博客、公眾號等平臺大量涌現出針對Java多線程技術的討論與分享。能為國內IT知識的建設貢獻微薄之力是讓我最欣慰的。

有些讀者在第一時間就根據書中的知識總結了學習筆記,并在博客中進行分享,筆者非常贊賞這種傳播知識的精神。知識就要分享,知識就要傳播,這樣才能共同進步。

第2版與第1版的區別

本書第1版上市后收到了大量的讀者反饋,我對每一個建議都細心地進行整理,力求在第2版中得以完善。

第2版在第1版的基礎上著重加強了8點更新:

1)大量知識點重排,更有利于閱讀與理解;

2)更新了讀者提出的共性問題并進行集中講解;

3)豐富Thread.java類API的案例,使其更具有實用性;

4)對線程的信息進行監控實時采樣;

5)強化了volatile語義、多線程核心synchronized的案例;

6)力求知識點連貫,方便深度學習與理解,增加原子與線程安全的內容;

7)深入淺出地介紹代碼重排特性;

8)細化工具類ThrealLocal和InheritableThreadLocal的源代碼分析與原理。

由于篇幅有限,有關線程池的知識請參考筆者的另一本書—《Java并發編程:核心方法與框架》,那本書中有針對Java并發編程技術的講解。在向分布式領域進軍時還需要用到NIO和Socket技術,故推薦筆者的拙作《NIO與Socket編程技術指南》,希望可以給讀者帶來一些幫助。

本書秉承大道至簡的主導思想,只介紹Java多線程開發中最值得關注的內容,希望拋磚引玉,以個人的一些想法和見解,為讀者拓展出更深入、更全面的思路。

本書特色

在撰寫本書的過程中,我盡量少用“?唆”的文字,全部以Demo式案例來講解技術點的實現,使讀者看到代碼及運行結果后就可以知道項目要解決的是什么問題,類似于網絡中博客的風格,讓讀者用最短的時間學習知識點,明白知識點如何應用,以及在使用時要避免什么,使讀者能夠快速學習知識并解決問題。

讀者對象

Java程序員;

系統架構師;

Java多線程開發者;

Java并發開發者;

大數據開發者;

其他對多線程技術感興趣的人員。

如何閱讀本書

本書本著實用、易懂的學習原則,利用7章來介紹Java多線程相關的技術。

第1章講解了Java多線程的基礎,包括Thread類的核心API的使用。

第2章講解了在多線程中對并發訪問的控制,主要是synchronized的使用。由于此關鍵字在使用上非常靈活,所以該章用很多案例來說明它的使用,為讀者學習同步知識打好堅實的基礎。

第3章講解了線程之間的通信與交互細節。該章主要介紹wait()、notifyAll()和notify()方法的使用,使線程間能夠互相通信,合作完成任務。該章還介紹了ThreadLocal類的使用。學習完該章,讀者就能在Thread多線程中進行數據的傳遞了。

第4章講解了Lock對象。因為synchronized關鍵字使用起來比較麻煩,所以Java 5提供了Lock對象,更好地實現了并發訪問時的同步處理,包括讀寫鎖等。

第5章講解了Timer定時器類,其內部原理是使用多線程技術。定時器在執行計劃任務時是很重要的,在進行Android開發時也會深入使用。

第6章講解的單例模式雖然很簡單,但如果遇到多線程將會變得非常麻煩。如何在多線程中解決這么棘手的問題呢?本章會全面給出解決方案。

第7章對前面章節遺漏的技術空白點進行補充,通過案例使多線程的知識體系更加完整,盡量做到不出現技術空白點。

交流和支持

由于筆者水平有限,加上編寫時間倉促,書中難免會出現一些疏漏或者不準確的地方,懇請讀者批評指正,期待能夠得到你們的真摯反饋,在技術之路上互勉共進。

聯系筆者的郵箱是279377921@qq.com。

致謝

在本書出版的過程中,感謝公司領導和同事的大力支持,感謝家人給予我充足的時間來撰寫稿件,感謝出生3個多月的兒子高晟京,看到你,我有了更多動力,最后感謝在此稿件上耗費大量精力的高婧雅編輯與她的同事們,是你們的鼓勵和幫助,引導我順利完成了本書。



高洪巖
內容簡介:

技術暢銷書全新升級,案例式講解,逐一分析和驗證每個技術點,通俗易懂。本書涵蓋多線程編程的核心庫、方法、原理,解決高并發環境下的業務瓶頸。第1章講解Java多線程的基礎知識,包括Thread類的核心API使用。第2章講解了在多線程中通過synchronized關鍵字對并發訪問進行控制的方法,為讀者學習同步知識打好堅實的基礎。第3章介紹線程間通信,以在多線程中進行數據傳遞。第4章介紹并發訪問時的同步處理實現,包括讀寫鎖(Lock對象)等相關技術點。第5章剖析定時器Timer類的內部原理。定時器在Android開發中會有深入應用,是很重要的技術點。第6章介紹單例模式下多線程的全面解決方案。第7章對前面遺漏的知識點進行補充,使多線程的知識體系更加完整,盡量做到不出現技術空白點。



自本書第1版出版以來,作者收到了很多讀者反饋,除針對讀者提出的共性問題及易讀性等方面加以改進之外,此次修改主要體現在以下幾個方面:

Thread.java類API的案例更豐富,且更具有實用性;

對線程的信息進行監控實時采樣;

強化了volatile語義、synchronized關鍵字的案例;

增加原子與線程安全的內容;

深入淺出地介紹了代碼重排特性;

細化工具類ThreadLocal和InheritableThreadLocal的源代碼分析與原理。
目錄:

第1章 Java多線程技能1
1.1 進程和多線程概述1
1.2 使用多線程5
1.2.1 繼承Thread類5
1.2.2 使用常見命令分析線程的信息8
1.2.3 線程隨機性的展現11
1.2.4 執行start()的順序不代表執行run()的順序12
1.2.5 實現Runnable接口13
1.2.6 使用Runnable接口實現多線程的優點14
1.2.7 實現Runnable接口與繼承Thread類的內部流程16
1.2.8 實例變量共享造成的非線程安全問題與解決方案17
1.2.9 Servlet技術造成的非線程安全問題與解決方案21
1.2.10 留意i--與System.out.println()出現的非線程安全問題24
1.3 currentThread()方法26
1.4 isAlive()方法29
1.5 sleep(long millis)方法31
1.6 sleep(long millis, int nanos)方法33
1.7 StackTraceElement[] getStackTrace()方法33
1.8 static void dumpStack()方法35
1.9 static Map getAllStackTraces()方法36
1.10 getId()方法38
1.11 停止線程38
1.11.1 停止不了的線程39
1.11.2 判斷線程是否為停止狀態41
1.11.3 能停止的線程—異常法43
1.11.4 在sleep狀態下停止線程47
1.11.5 用stop()方法暴力停止線程49
1.11.6 stop()方法與java.lang.ThreadDeath異常51
1.11.7 使用stop()釋放鎖給數據造成不一致的結果52
1.11.8 使用“return;”語句停止線程的缺點與解決方案54
1.12 暫停線程57
1.12.1 suspend()方法與resume()方法的使用57
1.12.2 suspend()方法與resume()方法的缺點—獨占58
1.12.3 suspend()方法與resume()方法的缺點—數據不完整62
1.13 yield()方法63
1.14 線程的優先級64
1.14.1 線程優先級的繼承特性65
1.14.2 優先級的規律性66
1.14.3 優先級的隨機性68
1.14.4 優先級對線程運行速度的影響70
1.15 守護線程71
1.16 本章小結73
第2章 對象及變量的并發訪問74
2.1 synchronized同步方法74
2.1.1 方法內的變量為線程安全74
2.1.2 實例變量非線程安全問題與解決方案77
2.1.3 同步synchronized在字節碼指令中的原理80
2.1.4 多個對象多個鎖81
2.1.5 將synchronized方法與對象作為鎖84
2.1.6 臟讀89
2.1.7 synchronized鎖重入91
2.1.8 鎖重入支持繼承的環境93
2.1.9 出現異常,鎖自動釋放94
2.1.10 重寫方法不使用synchronized96
2.1.11 public static boolean holdsLock(Object obj)方法的使用99
2.2 synchronized同步語句塊99
2.2.1 synchronized方法的弊端99
2.2.2 synchronized同步代碼塊的使用102
2.2.3 用同步代碼塊解決同步方法的弊端104
2.2.4 一半異步,一半同步105
2.2.5 synchronized代碼塊間的同步性108
2.2.6 println()方法也是同步的110
2.2.7 驗證同步synchronized(this)代碼塊是鎖定當前對象的110
2.2.8 將任意對象作為鎖113
2.2.9 多個鎖就是異步執行116
2.2.10 驗證方法被調用是隨機的118
2.2.11 不同步導致的邏輯錯誤及其解決方法121
2.2.12 細化驗證3個結論124
2.2.13 類Class的單例性129
2.2.14 靜態同步synchronized方法與synchronized(class)代碼塊130
2.2.15 同步syn static方法可以對類的所有對象實例起作用135
2.2.16 同步syn(class)代碼塊可以對類的所有對象實例起作用137
2.2.17 String常量池特性與同步相關的問題與解決方案138
2.2.18 同步synchronized方法無限等待問題與解決方案141
2.2.19 多線程的死鎖143
2.2.20 內置類與靜態內置類146
2.2.21 內置類與同步:實驗1149
2.2.22 內置類與同步:實驗2151
2.2.23 鎖對象改變導致異步執行153
2.2.24 鎖對象不改變依然同步執行156
2.2.25 同步寫法案例比較158
2.3 volatile關鍵字159
2.3.1 可見性的測試159
2.3.2 原子性的測試168
2.3.3 禁止代碼重排序的測試176
2.4 本章小結187
第3章 線程間通信188
3.1 wait/notify機制188
3.1.1 不使用wait/notify機制實現線程間通信188
3.1.2 wait/notify機制191
3.1.3 wait/notify機制的原理192
3.1.4 wait()方法的基本使用192
3.1.5 完整實現wait/notify機制194
3.1.6 使用wait/notify機制實現list.size()等于5時的線程銷毀195
3.1.7 對業務代碼進行封裝198
3.1.8 線程狀態的切換201
3.1.9 wait()方法:立即釋放鎖202
3.1.10 sleep()方法:不釋放鎖203
3.1.11 notify()方法:不立即釋放鎖204
3.1.12 interrupt()方法遇到wait()方法206
3.1.13 notify()方法:只通知一個線程208
3.1.14 notifyAll()方法:通知所有線程211
3.1.15 wait(long)方法的基本使用212
3.1.16 wait(long)方法自動向下運行需要重新持有鎖214
3.1.17 通知過早問題與解決方法217
3.1.18 wait條件發生變化與使用while的必要性220
3.1.19 生產者/消費者模式的實現224
3.1.20 通過管道進行線程間通信—字節流250
3.1.21 通過管道進行線程間通信—字符流253
3.1.22 實現wait/notify的交叉備份256
3.2 join()方法的使用259
3.2.1 學習join()方法前的鋪墊259
3.2.2 join()方法和interrupt()方法出現異常261
3.2.3 join(long)方法的使用263
3.2.4 join(long)方法與sleep(long)方法的區別264
3.2.5 join()方法后面的代碼提前運行—出現意外 268
3.2.6 join()方法后面的代碼提前運行—解釋意外270
3.2.7 join(long millis, int nanos)方法的使用273
3.3 類ThreadLocal的使用273
3.3.1 get()方法與null274
3.3.2 類ThreadLocal存取數據流程分析275
3.3.3 驗證線程變量的隔離性277
3.3.4 解決get()方法返回null的問題282
3.3.5 驗證重寫initialValue()方法的隔離性283
3.4 類InheritableThreadLocal的使用284
3.4.1 類ThreadLocal不能實現值繼承285
3.4.2 使用InheritableThreadLocal體現值繼承特性286
3.4.3 值繼承特性在源代碼中的執行流程288
3.4.4 父線程有最新的值,子線程仍是舊值291
3.4.5 子線程有最新的值,父線程仍是舊值293
3.4.6 子線程可以感應對象屬性值的變化294
3.4.7 重寫childValue()方法實現對繼承的值進行加工297
3.5 本章小結298
第4章 Lock對象的使用299
4.1 使用ReentrantLock類299
4.1.1 使用ReentrantLock實現同步299
4.1.2 驗證多代碼塊間的同步性301
4.1.3 await()方法的錯誤用法與更正304
4.1.4 使用await()和signal()實現wait/notify機制307
4.1.5 await()方法暫停線程運行的原理309
4.1.6 通知部分線程—錯誤用法312
4.1.7 通知部分線程—正確用法314
4.1.8 實現生產者/消費者模式一對一交替輸出317
4.1.9 實現生產者/消費者模式多對多交替輸出319
4.1.10 公平鎖與非公平鎖321
4.1.11 public int getHoldCount()方法的使用324
4.1.12 public final int getQueue Length()方法的使用325
4.1.13 public int getWaitQueue-Length (Condition condition)方法的使用327
4.1.14 public final boolean has-QueuedThread (Thread thread)方法的使用328
4.1.15 public final boolean has-QueuedThreads()方法的使用329
4.1.16 public boolean hasWaiters (Con-dition condition)方法的使用331
4.1.17 public final boolean isFair()方法的使用332
4.1.18 public boolean isHeldBy-CurrentThread()方法的使用333
4.1.19 public boolean isLocked()方法的使用334
4.1.20 public void lockInterruptibly()方法的使用335
4.1.21 public boolean tryLock()方法的使用336
4.1.22 public boolean tryLock (long timeout, TimeUnit unit)方法的使用338
4.1.23 public boolean await (long time, TimeUnit unit)方法的使用339
4.1.24 public long awaitNanos(long nanosTimeout)方法的使用341
4.1.25 public boolean awaitUntil(Date deadline)方法的使用342
4.1.26 public void awaitUninterru-ptibly()方法的使用344
4.1.27 實現線程按順序執行業務346
4.2 使用ReentrantReadWriteLock類349
4.2.1 ReentrantLock類的缺點349
4.2.2 ReentrantReadWriteLock類的使用—讀讀共享351
4.2.3 ReentrantReadWriteLock類的使用—寫寫互斥352
4.2.4 ReentrantReadWriteLock類的使用—讀寫互斥352
4.2.5 ReentrantReadWriteLock類的使用—寫讀互斥354
4.3 本章小結355
第5章 定時器Timer356
5.1 定時器Timer的使用356
5.1.1 schedule(TimerTask task, Datetime)方法的測試356
5.1.2 schedule(TimerTask task, Date firstTime, long period)方法的測試366
5.1.3 schedule(TimerTask task, long delay)方法的測試374
5.1.4 schedule(TimerTask task, long delay, long period)方法的測試374
5.1.5 scheduleAtFixedRate (TimerTask task, Date firstTime, long period)方法的測試375
5.2 本章小結384
第6章 單例模式與多線程385
6.1 立即加載/餓漢模式385
6.2 延遲加載/懶漢模式387
6.2.1 延遲加載/懶漢模式解析387
6.2.2 延遲加載/懶漢模式的缺點388
6.2.3 延遲加載/懶漢模式的解決方案390
6.3 使用靜態內置類實現單例模式399
6.4 序列化與反序列化的單例模式實現400
6.5 使用static代碼塊實現單例模式402
6.6 使用enum枚舉數據類型實現單例模式404
6.7 完善使用enum枚舉數據類型實現單例模式405
6.8 本章小結407
第7章 拾遺增補408
7.1 線程的狀態408
7.1.1 驗證NEW、RUNNABLE和TERMINATED410
7.1.2 驗證TIMED_WAITING411
7.1.3 驗證BLOCKED412
7.1.4 驗證WAITING414
7.2 線程組415
7.2.1 線程對象關聯線程組:一級關聯416
7.2.2 線程對象關聯線程組:多級關聯417
7.2.3 線程組自動歸屬特性418
7.2.4 獲取根線程組419
7.2.5 線程組中加線程組420
7.2.6 組內的線程批量停止421
7.2.7 遞歸取得與非遞歸取得組內對象422
7.3 Thread.activeCount()方法的使用423
7.4 Thread.enumerate(Thread tarray[])方法的使用423
7.5 再次實現線程執行有序性424
7.6 SimpleDateFormat非線程安全426
7.6.1 出現異常426
7.6.2 解決異常的方法1428
7.6.3 解決異常的方法2430
7.7 線程中出現異常的處理431
7.7.1 線程出現異常的默認行為431
7.7.2 使用setUncaughtException-Handler()方法進行異常處理432
7.7.3 使用setDefaultUncaughtExce-ptionHandler()方法進行異常處理433
7.8 線程組內處理異常434
7.9 線程異常處理的優先性437
7.10 本章小結442
序: