作 者:葛一鳴 著
定 價:89
出 版 社:電子工業出版社
出版日期:2018年10月01日
頁 數:416
裝 幀:平裝
ISBN:9787121350030
●目 錄第1章 走入並行世界11.1 何去何從的並行計算11.1.1 忘掉那該死的並行21.1.2 可怕的現實:摩爾定律的失效41.1.3 柳暗花明:不斷地前進51.1.4 光明或是黑暗61.2 你必須知道的幾個概念71.2.1 同步(Synchronous)和異步(Asynchronous)71.2.2 並發(Concurrency)和並行(Parallelism)81.2.3 臨界區91.2.4 阻塞(Blocking)和非阻塞(Non-Blocking)91.2.5 死鎖(Deadlock)、饑餓(Starvation)和活鎖(Livelock)101.3 並發級別111.3.1 阻塞111.3.2 無饑餓(Starvation-Free)111.3.3 無障礙(Obstruction-Free)121.3.4 無鎖(Lock-Free)131.3.5 無等待(Wait-Free)131.4 有關並行的兩個重要定律141.4.1 Amdahl定律141.4.2 Gustafson定律161.4.3 是否相互矛盾171.5 回到Java:JMM181.5.1 原子性(Atomicity)181.5.2 可見性(Visibility)201.5.3 有序性(Ordering)221.5.4 哪些指令不能重排:Happen-Before規則27第2章 Java並行程序基礎292.1 有關線程你必須知道的事292.2 初始線程:線程的基本操作322.2.1 新建線程322.2.2 終止線程342.2.3 線程中斷382.2.4 等待(wait)和通知(notify)412.2.5 掛起(suspend)和繼續執行(resume)線程452.2.6 等待線程結束(join)和謙讓(yeild)492.3 volatile與Java內存模型(JMM)502.4 分門別類的管理:線程組532.5 駐守後臺:守護線程(Daemon)542.6 先做重要的事:線程優先級562.7 線程安全的概念與關鍵字synchronized572.8 程序中的幽靈:隱蔽的錯誤612.8.1 無提示的錯誤案例622.8.2 並發下的ArrayList632.8.3 並發下詭異的HashMap642.8.4 初學者常見的問題:錯誤的加鎖67第3章 JDK並發包713.1 多線程的團隊協作:同步控制713.1.1 關鍵字synchronized的功能擴展:重入鎖723.1.2 重入鎖的好搭檔:Condition813.1.3 允許多個線程同時訪問:信號量(Semaphore)853.1.4 ReadWriteLock讀寫鎖863.1.5 倒計數器:CountDownLatch893.1.6 循環柵欄:CyclicBarrier913.1.7 線程阻塞工具類:LockSupport943.1.8 Guava和RateLimiter限流983.2 線程復用:線程池1013.2.1 什麼是線程池1023.2.2 不要重復發明輪子:JDK對線程池的支持1023.2.3 刨根究底:核心線程池的內部實現1083.2.4 超負載了怎麼辦:拒絕策略1123.2.5 自定義線程創建:ThreadFactory1153.2.6 我的應用我做主:擴展線程池1163.2.7 合理的選擇:優化線程池線程數量1193.2.8 堆棧去哪裡了:在線程池中尋找堆棧1203.2.9 分而治之:Fork/Join框架1243.2.10 Guava中對線程池的擴展1283.3 不要重復發明輪子:JDK的並發容器1303.3.1 超好用的工具類:並發集合簡介1303.3.2 線程安全的HashMap1313.3.3 有關List的線程安全1323.3.4 高效讀寫的隊列:深度剖析ConcurrentLinkedQueue類1323.3.5 高效讀取:不變模式下的CopyOnWriteArrayList類1383.3.6 數據共享通道:BlockingQueue1393.3.7 隨機數據結構:跳表(SkipList)1443.4 使用JMH進行性能測試1463.4.1 什麼是JMH1473.4.2 Hello JMH1473.4.3 JMH的基本概念和配置1503.4.4 理解JMH中的Mode1513.4.5 理解JMH中的State1533.4.6 有關性能的一些思考1543.4.7 CopyOnWriteArrayList類與ConcurrentLinkedQueue類157第4章 鎖的優化及注意事項1614.1 有助於提高鎖性能的幾點建議1624.1.1 減少鎖持有時間1624.1.2 減小鎖粒度1634.1.3 用讀寫分離鎖來替換獨占鎖1654.1.4 鎖分離1654.1.5 鎖粗化1684.2 Java虛擬機對鎖優化所做的努力1694.2.1 鎖偏向1694.2.2 輕量級鎖1694.2.3 自旋鎖1704.2.4 鎖消除1704.3 人手一支筆:ThreadLocal1714.3.1 ThreadLocal的簡單使用1714.3.2 ThreadLocal的實現原理1734.3.3 對性能有何幫助1794.4 無鎖1824.4.1 與眾不同的並發策略:比較交換1824.4.2 無鎖的線程安全整數:AtomicInteger1834.4.3 Java中的指針:Unsafe類1854.4.4 無鎖的對像引用:AtomicReference1874.4.5 帶有時間戳的對像引用:AtomicStampedReference1904.4.6 數組也能無鎖:AtomicIntegerArray1934.4.7 讓普通變量也享受原子操作:AtomicIntegerFieldUpdater1944.4.8 挑戰無鎖算法:無鎖的Vector實現1964.4.9 讓線程之間互相幫助:細看SynchronousQueue的實現2014.5 有關死鎖的問題205第5章 並行模式與算法2095.1 探討單例模式2095.2 不變模式2135.3 生產者-消費者模式2155.4 高性能的生產者-消費者模式:無鎖的實現2205.4.1 無鎖的緩存框架:Disruptor2215.4.2 用Disruptor框架實現生產者-消費者模式的案例2225.4.3 提高消費者的響應時間:選擇合適的策略2255.4.4 CPU Cache的優化:解決偽共享問題2265.5 Future模式2305.5.1 Future模式的主要角色2325.5.2 Future模式的簡單實現2335.5.3 JDK中的Future模式2365.5.4 Guava對Future模式的支持2385.6 並行流水線2405.7 並行搜索2445.8 並行排序2465.8.1 分離數據相關性:奇偶交換排序2465.8.2 改進的插入排序:希爾排序2505.9 並行算法:矩陣乘法2545.10 準備好了再通知我:網絡NIO2585.10.1 基於Socket的服務端多線程模式2595.10.2 使用NIO進行網絡編程2645.10.3 使用NIO來實現客戶端2725.11 讀完了再通知我:AIO2745.11.1 AIO EchoServer的實現2755.11.2 AIO Echo客戶端的實現277第6章 Java 8/9/10與並發2816.1 Java 8的函數式編程簡介2816.1.1 函數作為一等公民2826.1.2 無副作用2836.1.3 聲明式的(Declarative)2836.1.4 不變的對像2846.1.5 易於並行2846.1.6 更少的代碼2846.2 函數式編程基礎2856.2.1 FunctionalInterface注釋2856.2.2 接口默認方法2866.2.3 lambda表達式2906.2.4 方法引用2916.3 一步一步走入函數式編程2936.4 並行流與並行排序2986.4.1 使用並行流過濾數據2986.4.2 從集合得到並行流2996.4.3 並行排序2996.5 增強的Future:CompletableFuture3006.5.1 完成了就通知我3006.5.2 異步執行任務3016.5.3 流式調用3036.5.4 CompletableFuture中的異常處理3036.5.5 組合多個CompletableFuture3046.5.6 支持timeout的 CompletableFuture3066.6 讀寫鎖的改進:StampedLock3066.6.1 StampedLock使用示例3076.6.2 StampedLock的小陷阱3086.6.3 有關StampedLock的實現思想3106.7 原子類的增強3136.7.1 更快的原子類:LongAdder3146.7.2 LongAdder功能的增強版:LongAccumulator3206.8 ConcurrentHashMap的增強3216.8.1 foreach操作3216.8.2 reduce操作3216.8.3 條件插入3226.8.4 search操作3236.8.5 其他新方法3246.9 發布和訂閱模式3246.9.1 簡單的發布訂閱例子3266.9.2 數據處理鏈328第7章 使用Akka構建高並發程序3317.1 新並發模型:Actor3327.2 Akka之Hello World3327.3 有關消息投遞的一些說明3367.4 Actor的生命周期3377.5 監督策略3417.6 選擇Actor3467.7 消息收件箱(Inbox)3467.8 消息路由3487.9 Actor的內置狀態轉換3517.10 詢問模式:Actor中的Future3547.11 多個Actor同時修改數據:Agent3567.12 像數據庫一樣操作內存數據:軟件事務內存3597.13 一個有趣的例子:並發粒子群的實現3637.13.1 什麼是粒子群算法3647.13.2 粒子群算法的計算過程3647.13.3 粒子群算法能做什麼3667.13.4 使用Akka實現粒子群367第8章 並行程序調試3758.1 準備實驗樣本3758.2 正式起航3768.3 掛起整個虛擬機3798.4 調試進入ArrayList內部380第9章 多線程優化示例―Jetty核心代碼分析3859.1 Jetty簡介與架構3859.2 Jetty服務器初始化3879.2.1 初始化線程池3879.2.2 初始化ScheduledExecutorScheduler3899.2.3 初始化ByteBufferPool3909.2.4 維護ConnectionFactory3939.2.5 計算ServerConnector的線程數量3949.3 啟動Jetty服務器3949.3.1 設置啟動狀態3949.3.2 注冊ShutdownMonitor3959.3.3 計算繫統的線程數量3959.3.4 啟動QueuedThreadPool3969.3.5 啟動Connector3969.4 處理HTTP請求3999.4.1 Accept成功3999.4.2 請求處理401
在單核CPU時代,單任務在一個時間點隻能執行單一程序,隨著多核CPU的發展,並行程序開發變得尤為重要。本書主要介紹基於Java的並行程序設計基礎、思路、方法和實戰。靠前,立足於並發程序基礎,詳細介紹Java進行並行程序設計的基本方法。第二,進一步詳細介紹了JDK對並行程序的強大支持,幫助讀者快速、穩健地進行並行程序開發。第三,詳細討論了“鎖”的優化和提高並行程序性能級別的方法和思路。第四,介紹了並行的基本設計模式,以及Java 8/9/10對並行程序的支持和改進。第五,介紹了高並發框架Akka的使用方法。第六,詳細介紹了並行程序的調試方法。第七,分析Jetty代碼並給出一些其在高並發優化方面的例子。本書內容豐富,實例典型,實用性強,適合有一定Java基礎的技術開發人員閱讀。
"前 言關於Java與並行由於單核CPU的主頻逐步逼近極限,多核CPU架構成了一種必然的技術趨勢,因此多線程並行程序便顯得越來越重要。並行計算的一個重要應用場景就是服務端編程。目前服務端CPU的核心數已經輕松超越10個,而Java顯然已經成為當下 的服務端編程語言,且已經更新到JDK 10,因此熟悉和了解基於Java的並行程序開發有著重要的實用價值。本書的體繫結構本書立足於實際開發,又不缺乏理論介紹,力求通俗易懂、循序漸進。本書共分為9章。章主要介紹了並行計算中相關的一些基本概念,樹立讀者對並行計算的基本認識,介紹了兩個重要的並行性能評估定律,以及Java內存模型JMM。第2章介紹了Java並行程序開發的基礎,包括Java中Thread的基本使用方法等,也詳細介紹了並行程序容易引發的一些錯誤,以及容易出現的誤用等