Java 多線程編程核心技術, 3/e

高洪岩

  • 出版商: 機械工業
  • 出版日期: 2021-12-28
  • 售價: $774
  • 貴賓價: 9.5$735
  • 語言: 簡體中文
  • 頁數: 572
  • 裝訂: 平裝
  • ISBN: 7111698584
  • ISBN-13: 9787111698586
  • 相關分類: Java
  • 立即出貨 (庫存 < 3)

買這商品的人也買了...

商品描述

本書作為講解Java多線程技術的教程,主要介紹非常核心並常用的技術點,比如解決線程Thread的停止,
線程對象Thread的暫停,線程的優先級,synchronized關鍵字的使用,以及使用它解決非線程安全的問題。
使用volatile關鍵字解決變量可見性問題,使用wait()及notify()方法實現等待通知模式,
還有使用ThreadLocal類進行隔離變量,Lock鎖對象的使用,
包含Condition類實現生產者-消費者模式,深入講解了Condition類在使用上的細節。
還包括對Lock鎖對像中的常見API進行細化講解,
ReentrantReadWriteLock讀寫鎖的使用等,Timer定時器類的使用。
多線程實現單例模式時完整的解決步驟,以及多線程異常的處理等常見Java多線程解決方案。
並發集合框架的使用,以及線程池技術點的使用。

作者簡介

高洪岩,某世界500強企業不錯項目經理,具有10餘年項目管理與開發經驗,對多線程和並發、Android移動開發、智能報表、分佈式處理等企業級架構技術深耕多年,專注於對Java技術開發難點與要點的理解,擁有良好的技術素養和豐富的實踐經驗,一直在持續關注架構的優化和重構領域,喜歡用技術與教育相結合的方式分享知識。作者著有《Java多線程編程核心技術》《Java並發編程:核心方法與框架》《Java EE核心框架實戰第2版》《NIO與Socket編程技術指南》等圖書。

目錄大綱

前 言
第1章 Java多線程技能  1
1.1 進程和線程的定義及多線程的優點  1
1.2 使用多線程  5
1.2.1 繼承Thread類  6
1.2.2 使用常見的3個命令分析線程的信息  8
1.2.3 線程隨機性的展現  10
1.2.4 執行start()的順序不代表執行run()的順序  12
1.2.5 實現Runnable接口  14
1.2.6 使用Runnable接口實現多線程的優點  15
1.2.7 public Thread(Runnable target)中的target參數  16
1.2.8 實例變量共享導致的“非線程安全”問題與相應的解決方案  18
1.2.9 Servlet技術也會引起“非線程安全”問題  22
1.2.10 留意i--與System.out.println()出現的“非線程安全”問題  25
1.2.11 方法run()被JVM所調用  27
1.3 方法currentThread()  27
1.4 方法isAlive()  30
1.5 方法sleep(long millis)  33
1.6 方法sleep(long millis, int nanos)  34
1.7 方法StackTraceElement[] getStack-Trace()  35
1.8 方法static void dumpStack()  36
1.9 方法Map<Thread, StackTrace-Element[]> getAllStackTraces()  37
1.10 方法getId()  39
1.11 停止線程  40
1.11.1 停止不了的線程  41
1.11.2 判斷線程是不是停止狀態  42
1.11.3 清除中斷狀態的使用場景  44
1.11.4 能停止的線程—異常法  48
1.11.5 在sleep狀態下停止  51
1.11.6 使用stop()暴力停止線程  53
1.11.7 方法stop()與java.lang.Thread-Death異常  55
1.11.8 使用stop()釋放鎖導致數據結果不一致  57
1.11.9 使用return;語句停止線程的缺點及相應的解決方案  59
1.12 暫停線程  61
1.12.1 方法suspend()與resume()的使用  62
1.12.2 方法suspend()與resume()的缺點—獨占  63
1.12.3 方法suspend()與resume()的缺點—數據不完整  66
1.12.4 使用LockSupport類實現線程暫停與恢復  67
1.13 方法yield()  69
1.14 線程的優先級  70
1.14.1 線程優先級的繼承特性  71
1.14.2 線程優先級的規律性  72
1.14.3 線程優先級的隨機性  75
1.14.4 看誰跑得快  76
1.15 守護線程  78
1.16 並發與並行  79
1.17 同步與異步  80
1.18 多核CPU不一定比單核CPU運行快  81
1.19 本章小結  82

第2章 對象及變量的並發訪問  83
2.1 synchronized同步方法  83
2.1.1 方法內的變量是線程安全的  83
2.1.2 實例變量“非線程安全”問題及解決方案  85
2.1.3 同步synchronized在字節碼指令中的原理  88
2.1.4 多個對像多個鎖  90
2.1.5 synchronized方法將對像作為鎖  92
2.1.6 臟讀與解決  97
2.1.7 synchronized鎖重入  99
2.1.8 繼承環境下的鎖重入  100
2.1.9 出現異常,鎖自動釋放  102
2.1.10 非同步方法?:不使用synchronized重寫方法  104
2.2 synchronized同步語句塊  106
2.2.1 synchronized方法的弊端  106
2.2.2 synchronized同步代碼塊的使用  109
2.2.3 用同步代碼塊解決同步方法的弊端  111
2.2.4 一半異步,一半同步  112
2.2.5 synchronized代碼塊間的同步性  114
2.2.6 方法println()也是同步的  116
2.2.7 驗證synchronized(this)同步代碼塊是鎖定當前對象的  117
2.2.8 將任意對像作為鎖  119
2.2.9 多個鎖就是異步執行  121
2.2.10 驗證方法被調用是隨機的  124
2.2.11 不同步導致的邏輯錯誤與解決方案  125
2.2.12 細化驗證3個結論  129
2.2.13 類對象的單例性  134
2.2.14 靜態同步?:synchronized方法與synchronized(class)代碼塊  135
2.2.15 同步synchronized方法可以對類的所有對象實例起作用  139
2.2.16 同步synchronized(class)代碼塊可以對類的所有對象實例起作用  141
2.2.17 String常量池特性與同步問題  143
2.2.18 synchronized方法無限等待問題與解決方案  146
2.2.19 多線程的死鎖  148
2.2.20 內置類與靜態內置類  150
2.2.21 內置類與同步?:實驗1  153
2.2.22 內置類與同步?:實驗2  155
2.2.23 鎖對象改變導致異步執行  156
2.2.24 鎖對像不改變依然是同步執行  159
2.2.25 同步寫法案例比較  161
2.2.26 方法holdsLock(Object obj)的使用  161
2.2.27 臨界區  162
2.3 volatile關鍵字  162
2.3.1 可見性的測試  163
2.3.2 原子性與非原子性的測試  171
2.3.3 禁止代碼重排序的測試  179
2.4 本章小結  190

第3章 線程間通信  191
3.1 wait/ notify機制  191
3.1.1 不使用wait/notify機制進行通信的缺點  191
3.1.2 什麼是wait/notify機制  194
3.1.3 wait/notify機制的原理  194
3.1.4 方法wait()的基本用法  195
3.1.5 使用代碼完整實現wait /notify機制  196
3.1.6 使用wait/notify機制實現線程銷毀  198
3.1.7 對業務代碼進行封裝  200
3.1.8 線程狀態的切換  203
3.1.9 方法wait()導致鎖立即釋放  204
3.1.10 方法sleep()不釋放鎖  206
3.1.11 方法notify()不立即釋放鎖  206
3.1.12 方法interrupt()遇到方法wait()  208
3.1.13 方法notify()只通知一個線程  210
3.1.14 方法notifyAll()通知所有線程  212
3.1.15 方法wait(long)的基本用法  213
3.1.16 方法wait(long)自動向下運行的條件  215
3.1.17 通知過早與相應的解決方案  218
3.1.18 等待條件發生變化  220
3.1.19 生產者/消費者模式實現  224
3.1.20 在管道中傳遞字節流  239
3.1.21 在管道中傳遞字符流  241
3.1.22 利用wait/notify機制實現交叉備份  244
3.1.23 方法sleep()和wait()的區別  247
3.2 方法join()的使用  247
3.2.1 學習方法join()前的鋪墊  247
3.2.2 用方法join()解決問題  248
3.2.3 方法join()和interrupt()出現異常  250
3.2.4 方法join(long)的使用  252
3.2.5 方法join(long)與sleep(long)的區別  254
3.2.6 方法join()後的代碼提前運行  257
3.2.7 方法join(long millis, int nanos)的使用  261
3.3 類ThreadLocal的使用  262
3.3.1 方法get()與null  262
3.3.2 類ThreadLocal存取數據流程分析  263
3.3.3 驗證線程變量的隔離性  266
3.3.4 解決get()返回null的問題  270
3.3.5 驗證重寫initialValue()方法的隔離性  271
3.3.6 使用remove()方法的必要性  272
3.4 類InheritableThreadLocal的使用  276
3.4.1 類ThreadLocal不能實現值繼承  277
3.4.2 使用InheritableThreadLocal體現值繼承特性  278
3.4.3 值繼承特性在源代碼中的執行流程  280
3.4.4 父線程有的值,子線程還是舊值?:不可變類型  285
3.4.5 子線程有的值,父線程還是舊值?:不可變類型  286
3.4.6 子線程可以感應對象屬性值的變化?:可變類型  288
3.4.7 重寫childValue方法實現對繼承值的加工  291
3.5 本章小結  291

第4章 鎖的使用  292
4.1 使用ReentrantLock類  292
4.1.1 使用ReentrantLock實現同步  292
4.1.2 驗證多代碼塊間的同步性  294
4.1.3 方法await()的錯誤用法與相應的解決方案  297
4.1.4 使用方法await()和方法signal()實現wait/notify  300
4.1.5 方法await()暫停的原理  302
4.1.6 通知部分線程?:錯誤用法  306
4.1.7 通知部分線程?:正確用法  308
4.1.8 實現生產者/消費者模式一對一交替打印  311
4.1.9 實現生產者/消費者模式多對多交替打印  313
4.1.10 公平鎖與非公平鎖  315
4.1.11 方法getHoldCount()的使用  318
4.1.12 方法getQueueLength()的使用  319
4.1.13 方法getWaitQueueLength(Condition condition)的使用  321
4.1.14 方法hasQueuedThread(Thread thread)的使用  322
4.1.15 方法hasQueuedThreads()的使用  323
4.1.16 方法hasWaiters(Condition condition)的使用  324
4.1.17 方法isFair()的使用  326
4.1.18 方法isHeldByCurrentThread()的使用  326
4.1.19 方法isLocked()的使用  327
4.1.20 方法lockInterruptibly()的使用  328
4.1.21 方法tryLock()的使用  330
4.1.22 方法tryLock(long timeout, Time-Unit unit)的使用  331
4.1.23 方法await(long time, TimeUnit unit)的使用  333
4.1.24 方法awaitNanos(long nanos-Timeout)的使用  334
4.1.25 方法awaitUntil(Date deadline)的使用  335
4.1.26 方法awaitUninterruptibly()的使用  337
4.1.27 實現線程按順序執行業務  339
4.2 使用ReentrantReadWriteLock類  342
4.2.1 類ReentrantLock的缺點  342
4.2.2 讀讀共享  344
4.2.3 寫寫互斥  344
4.2.4 讀寫互斥  345
4.2.5 寫讀互斥  346
4.3 本章小結  347

第5章 定時器  348
5.1 定時器的使用  348
5.1.1 方法schedule(TimerTask task, Date time)的測試  349
5.1.2 方法schedule(TimerTask task, Date f?irstTime, long period)的測試  357
5.1.3 方法schedule(TimerTask task, long delay)的測試  365
5.1.4 方法schedule(TimerTask task, long delay, long period)的測試  365
5.1.5 方法scheduleAtFixedRate(TimerTask task, Date f?irst-Time, long period)的測試  366
5.2 本章小結  374

第6章 單例模式與多線程  375
6.1 單例模式與多線程  375
6.1.1 立即加載/餓漢模式  375
6.1.2 延遲加載/懶漢模式  377
6.1.3 使用靜態內置類實現單例模式  388
6.1.4 序列化與反序列化的單例模式實現  389
6.1.5 使用static代碼塊實現單例模式  392
6.1.6 使用enum枚舉數據類型實現單例模式  393
6.1.7 完善使用enum枚舉實現單例模式  394
6.2 本章小結  396

第7章 拾遺增補  397
7.1 線程的狀態  397
7.1.1 驗證NEW、RUNNABLE和TERMINATED  399
7.1.2 驗證TIMED_WAITING  400
7.1.3 驗證BLOCKED  401
7.1.4 驗證WAITING  403
7.2 線程組  404
7.2.1 線程對象關聯線程組?:一級關聯  404
7.2.2 線程對象關聯線程組?:多級關聯  406
7.2.3 線程組自動歸屬特性  407
7.2.4 獲取根線程組  408
7.2.5 線程組內加線程組  409
7.2.6 組內的線程批量停止  409
7.2.7 遞歸取得與非遞歸取得組內對象  410
7.3 Thread.activeCount()方法的使用  412
7.4 Thread.enumerate(Thread tarray[])方法的使用  412
7.5 再次驗證線程執行有序性  412
7.6 類SimpleDateFormat非線程安全  414
7.6.1 出現異常  415
7.6.2 解決方法1  417
7.6.3 解決方法2  418
7.7 線程中出現異常的處理  420
7.7.1 線程出現異常的默認行為  420
7.7.2 使用setUncaughtException-Handler()方法進行異常處理  421
7.7.3 使用setDefaultUncaught-ExceptionHandler()方法進行異常處理  422
7.8 線程組內處理異常  423
7.9 線程異常處理的優先性  426
7.10 本章小結  431

第8章 並發集合框架  432
8.1 集合框架結構  432
8.1.1 接口Iterable  432
8.1.2 接口Collection  432
8.1.3 接口List  433
8.1.4 接口Set  434
8.1.5 接口Queue  435
8.1.6 接口Deque  435
8.2 非阻塞隊列  435
8.2.1 類ConcurrentHashMap的使用  436
8.2.2 類ConcurrentSkipListMap的使用  442
8.2.3 類ConcurrentSkipListSet的使用  444
8.2.4 類ConcurrentLinkedQueue的使用  447
8.2.5 類ConcurrentLinkedDeque的使用  451
8.2.6 類CopyOnWriteArrayList的使用  453
8.2.7 類CopyOnWriteArraySet的使用  454
8.3 阻塞隊列  456
8.3.1 類ArrayBlockingQueue與公平/非公平鎖的使用  456
8.3.2 類PriorityBlockingQueue的使用  461
8.3.3 類LinkedBlockingQueue的使用  463
8.3.4 類LinkedBlockingDeque的使用  463
8.3.5 類SynchronousQueue的使用  463
8.3.6 類DelayQueue的使用  466
8.3.7 類LinkedTransferQueue的使用  467
8.4 本章小結  476

第9章 線程池類ThreadPoolExecutor的使用  477
9.1 Executor接口介紹  477
9.2 使用Executors工廠類創建線程池  481
9.2.1 使用newCachedThreadPool()方法創建無界線程池  481
9.2.2 驗證newCachedThreadPool()方法創建線程池和線程復用特性  483
9.2.3 使用newCachedThreadPool (ThreadFactory)方法定制線程工廠  486
9.2.4 使用newCachedThread-Pool()方法創建無界線程池的缺點  487
9.2.5 使用newFixedThreadPool(int)
方法創建有界線程池  488
9.2.6 使用newSingleThread-Executor()方法創建單一線程池  490
9.3 ThreadPoolExecutor類的使用  491
9.3.1 隊列LinkedBlocking-Queue、ArrayBlocking-Queue和Synchronous-Queue的基本使用  491
9.3.2 構造方法參數詳解  495
9.3.3 方法shutdown()和shutdownNow()  521
9.3.4 方法List<Runnable> shutdown-Now()返回值的作用  525
9.3.5 方法shutdown()和shutdown-Now()與中斷  527
9.3.6 方法isShutdown()  529
9.3.7 方法isTerminating()和isTerminated()  530
9.3.8 方法awaitTermination(long timeout,TimeUnit unit)  531
9.3.9 工廠ThreadFactory+Thread+UncaughtExceptionHandler處理異常  533
9.3.10 方法set/getRejected-ExecutionHandler()  537
9.3.11 方法allowsCoreThreadTime-Out和allowCoreThreadTime-Out(bool)  539
9.3.12 方法prestartCoreThread()和prestartAllCoreThreads()  541
9.3.13 方法getCompletedTask-Count()  542
9.3.14 線程池ThreadPoolExecutor的拒絕策略  543
9.3.15 方法afterExecute()和beforeExecute()  549
9.3.16 方法remove(Runnable)的使用  551
9.3.17 多個get方法的測試  555
9.4 本章小結  558