第1章  走入並行世界  1
         1.1  何去何從的並行計算  1
         1.1.1  忘掉那該死的並行  2
         1.1.2  可怕的現實:摩爾定律的失效  4
         1.1.3  柳暗花明:不斷地前進  5
         1.1.4  光明或是黑暗  6
         1.2  你必須知道的幾個概念  7
         1.2.1  同步(Synchronous)和異步(Asynchronous)  7
         1.2.2  並發(Concurrency)和並行(Parallelism)  8
         1.2.3  臨界區  9
         1.2.4  阻塞(Blocking)和非阻塞(Non-Blocking)  9
         1.2.5  死鎖(Deadlock)、飢餓(Starvation)和活鎖(Livelock)  10
         1.3  並發級彆  11
         1.3.1  阻塞  11
         1.3.2  無飢餓(Starvation-Free)  11
         1.3.3  無障礙(Obstruction-Free)  12
         1.3.4  無鎖(Lock-Free)  13
         1.3.5  無等待(Wait-Free)  13
         1.4  有關並行的兩個重要定律  14
         1.4.1  Amdahl定律  14
         1.4.2  Gustafson定律  16
         1.4.3  是否相互矛盾  17
         1.5  迴到Java:JMM  18
         1.5.1  原子性(Atomicity)  18
         1.5.2  可見性(Visibility)  20
         1.5.3  有序性(Ordering)  22
         1.5.4  哪些指令不能重排:Happen-Before規則  27
         第2章  Java並行程序基礎  29
         2.1  有關綫程你必須知道的事  29
         2.2  初始綫程:綫程的基本操作  32
         2.2.1  新建綫程  32
         2.2.2  終止綫程  34
         2.2.3  綫程中斷  38
         2.2.4  等待(wait)和通知(notify)  41
         2.2.5  掛起(suspend)和繼續執行(resume)綫程  45
         2.2.6  等待綫程結束(join)和謙讓(yeild)  49
         2.3  volatile與Java內存模型(JMM)  50
         2.4  分門彆類的管理:綫程組  53
         2.5  駐守後颱:守護綫程(Daemon)  54
         2.6  先做重要的事:綫程優先級  56
         2.7  綫程安全的概念與關鍵字synchronized  57
         2.8  程序中的幽靈:隱蔽的錯誤  61
         2.8.1  無提示的錯誤案例  62
         2.8.2  並發下的ArrayList  63
         2.8.3  並發下詭異的HashMap  64
         2.8.4  初學者常見的問題:錯誤的加鎖  67
         第3章  JDK並發包  71
         3.1  多綫程的團隊協作:同步控製  71
         3.1.1  關鍵字synchronized的功能擴展:重入鎖  72
         3.1.2  重入鎖的好搭檔:Condition  81
         3.1.3  允許多個綫程同時訪問:信號量(Semaphore)  85
         3.1.4  ReadWriteLock讀寫鎖  86
         3.1.5  倒計數器:CountDownLatch  89
         3.1.6  循環柵欄:CyclicBarrier  91
         3.1.7  綫程阻塞工具類:LockSupport  94
         3.1.8  Guava和RateLimiter限流  98
         3.2  綫程復用:綫程池  101
         3.2.1  什麼是綫程池  102
         3.2.2  不要重復發明輪子:JDK對綫程池的支持  102
         3.2.3  刨根究底:核心綫程池的內部實現  108
         3.2.4  超負載瞭怎麼辦:拒絕策略  112
         3.2.5  自定義綫程創建:ThreadFactory  115
         3.2.6  我的應用我做主:擴展綫程池  116
         3.2.7  閤理的選擇:優化綫程池綫程數量  119
         3.2.8  堆棧去哪裏瞭:在綫程池中尋找堆棧  120
         3.2.9  分而治之:Fork/Join框架  124
         3.2.10  Guava中對綫程池的擴展  128
         3.3  不要重復發明輪子:JDK的並發容器  130
         3.3.1  超好用的工具類:並發集閤簡介  130
         3.3.2  綫程安全的HashMap  131
         3.3.3  有關List的綫程安全  132
         3.3.4  高效讀寫的隊列:深度剖析ConcurrentLinkedQueue類  132
         3.3.5  高效讀取:不變模式下的CopyOnWriteArrayList類  138
         3.3.6  數據共享通道:BlockingQueue  139
         3.3.7  隨機數據結構:跳錶(SkipList)  144
         3.4  使用JMH進行性能測試  146
         3.4.1  什麼是JMH  147
         3.4.2  Hello JMH  147
         3.4.3  JMH的基本概念和配置  150
         3.4.4  理解JMH中的Mode  151
         3.4.5  理解JMH中的State  153
         3.4.6  有關性能的一些思考  154
         3.4.7  CopyOnWriteArrayList類與ConcurrentLinkedQueue類  157
         第4章  鎖的優化及注意事項  161
         4.1  有助於提高鎖性能的幾點建議  162
         4.1.1  減少鎖持有時間  162
         4.1.2  減小鎖粒度  163
         4.1.3  用讀寫分離鎖來替換獨占鎖  165
         4.1.4  鎖分離  165
         4.1.5  鎖粗化  168
         4.2  Java虛擬機對鎖優化所做的努力  169
         4.2.1  鎖偏嚮  169
         4.2.2  輕量級鎖  169
         4.2.3  自鏇鎖  170
         4.2.4  鎖消除  170
         4.3  人手一支筆:ThreadLocal  171
         4.3.1  ThreadLocal的簡單使用  171
         4.3.2  ThreadLocal的實現原理  173
         4.3.3  對性能有何幫助  179
         4.4  無鎖  182
         4.4.1  與眾不同的並發策略:比較交換  182
         4.4.2  無鎖的綫程安全整數:AtomicInteger  183
         4.4.3  Java中的指針:Unsafe類  185
         4.4.4  無鎖的對象引用:AtomicReference  187
         4.4.5  帶有時間戳的對象引用:AtomicStampedReference  190
         4.4.6  數組也能無鎖:AtomicIntegerArray  193
         4.4.7  讓普通變量也享受原子操作:AtomicIntegerFieldUpdater  194
         4.4.8  挑戰無鎖算法:無鎖的Vector實現  196
         4.4.9  讓綫程之間互相幫助:細看SynchronousQueue的實現  201
         4.5  有關死鎖的問題  205
         第5章  並行模式與算法  209
         5.1  探討單例模式  209
         5.2  不變模式  213
         5.3  生産者-消費者模式  215
         5.4  高性能的生産者-消費者模式:無鎖的實現  220
         5.4.1  無鎖的緩存框架:Disruptor  221
         5.4.2  用Disruptor框架實現生産者-消費者模式的案例  222
         5.4.3  提高消費者的響應時間:選擇閤適的策略  225
         5.4.4  CPU Cache的優化:解決僞共享問題  226
         5.5  Future模式  230
         5.5.1  Future模式的主要角色  232
         5.5.2  Future模式的簡單實現  233
         5.5.3  JDK中的Future模式  236
         5.5.4  Guava對Future模式的支持  238
         5.6  並行流水綫  240
         5.7  並行搜索  244
         5.8  並行排序  246
         5.8.1  分離數據相關性:奇偶交換排序  246
         5.8.2  改進的插入排序:希爾排序  250
         5.9  並行算法:矩陣乘法  254
         5.10  準備好瞭再通知我:網絡NIO  258
         5.10.1  基於Socket的服務端多綫程模式  259
         5.10.2  使用NIO進行網絡編程  264
         5.10.3  使用NIO來實現客戶端  272
         5.11  讀完瞭再通知我:AIO  274
         5.11.1  AIO EchoServer的實現  275
         5.11.2  AIO Echo客戶端的實現  277
         第6章  Java 8/9/10與並發  281
         6.1  Java 8的函數式編程簡介  281
         6.1.1  函數作為一等公民  282
         6.1.2  無副作用  283
         6.1.3  聲明式的(Declarative)  283
         6.1.4  不變的對象  284
         6.1.5  易於並行  284
         6.1.6  更少的代碼  284
         6.2  函數式編程基礎  285
         6.2.1  FunctionalInterface注釋  285
         6.2.2  接口默認方法  286
         6.2.3  lambda錶達式  290
         6.2.4  方法引用  291
         6.3  一步一步走入函數式編程  293
         6.4  並行流與並行排序  298
         6.4.1  使用並行流過濾數據  298
         6.4.2  從集閤得到並行流  299
         6.4.3  並行排序  299
         6.5  增強的Future:CompletableFuture  300
         6.5.1  完成瞭就通知我  300
         6.5.2  異步執行任務  301
         6.5.3  流式調用  303
         6.5.4  CompletableFuture中的異常處理  303
         6.5.5  組閤多個CompletableFuture  304
         6.5.6  支持timeout的 CompletableFuture  306
         6.6  讀寫鎖的改進:StampedLock  306
         6.6.1  StampedLock使用示例  307
         6.6.2  StampedLock的小陷阱  308
         6.6.3  有關StampedLock的實現思想  310
         6.7  原子類的增強  313
         6.7.1  更快的原子類:LongAdder  314
         6.7.2  LongAdder功能的增強版:LongAccumulator  320
         6.8  ConcurrentHashMap的增強  321
         6.8.1  foreach操作  321
         6.8.2  reduce操作  321
         6.8.3  條件插入  322
         6.8.4  search操作  323
         6.8.5  其他新方法  324
         6.9  發布和訂閱模式  324
         6.9.1  簡單的發布訂閱例子  326
         6.9.2  數據處理鏈  328
         第7章  使用Akka構建高並發程序  331
         7.1  新並發模型:Actor  332
         7.2  Akka之Hello World  332
         7.3  有關消息投遞的一些說明  336
         7.4  Actor的生命周期  337
         7.5  監督策略  341
         7.6  選擇Actor  346
         7.7  消息收件箱(Inbox)  346
         7.8  消息路由  348
         7.9  Actor的內置狀態轉換  351
         7.10  詢問模式:Actor中的Future  354
         7.11  多個Actor同時修改數據:Agent  356
         7.12  像數據庫一樣操作內存數據:軟件事務內存  359
         7.13  一個有趣的例子:並發粒子群的實現  363
         7.13.1  什麼是粒子群算法  364
         7.13.2  粒子群算法的計算過程  364
         7.13.3  粒子群算法能做什麼  366
         7.13.4  使用Akka實現粒子群  367
         第8章  並行程序調試  375
         8.1  準備實驗樣本  375
         8.2  正式起航  376
         8.3  掛起整個虛擬機  379
         8.4  調試進入ArrayList內部  380
         第9章  多綫程優化示例—Jetty核心代碼分析  385
         9.1  Jetty簡介與架構  385
         9.2  Jetty服務器初始化  387
         9.2.1  初始化綫程池  387
         9.2.2  初始化ScheduledExecutorScheduler  389
         9.2.3  初始化ByteBufferPool  390
         9.2.4  維護ConnectionFactory  393
         9.2.5  計算ServerConnector的綫程數量  394
         9.3  啓動Jetty服務器  394
         9.3.1  設置啓動狀態  394
         9.3.2  注冊ShutdownMonitor  395
         9.3.3  計算係統的綫程數量  395
         9.3.4  啓動QueuedThreadPool  396
         9.3.5  啓動Connector  396
         9.4  處理HTTP請求  399
         9.4.1  Accept成功  399
         9.4.2  請求處理  401
      · · · · · ·     (
收起)