在過去單核CPU時代,單任務在一個時間點只能執行單一程序,隨著多核CPU的發展,并行程序開發就顯得尤為重要。
本書主要介紹基于Java的并行程序設計基礎、思路、方法和實戰。,立足于并發程序基礎,詳細介紹Java中進行并行程序設計的基本方法。第二,進一步詳細介紹JDK中對并行程序的強大支持,幫助讀者快速、穩健地進行并行程序開發。第三,詳細討論有關“鎖”的優化和提高并行程序性能級別的方法和思路。第四,介紹并行的基本設計模式及Java 8對并行程序的支持和改進。第五,介紹高并發框架Akka的使用方法。后,詳細介紹并行程序的調試方法。
1. 結構清晰。本書一共8 章,總體上循序漸進,逐步提升。每一章都各自有鮮明的側重點,有利于讀者快速抓住重點。
2. 理論結合實戰。本書注重實戰,書中重要的知識點都安排了代碼實例,幫助讀者理解。同時也不忘記對系統的內部實現原理進行深度剖析。
3. 通俗易懂。本書盡量避免采用過于理論的描述方式,簡單的白話文風格貫穿全書,配圖基本上為手工繪制,降低了理解難度,并盡量做到讀者在閱讀過程中少盲點、無盲點。
海報
推薦購買:
《實戰Java虛擬機——JVM故障診斷與性能優化》
葛一鳴:51CTO特約講師,國家認證系統分析師,獲得Oracle OCP認證。長期從事Java軟件開發工作,對Java程序設計、JVM有深入的研究,對設計模式、人工智能、神經網絡、數據挖掘等技術有濃厚興趣,著有《自己動手寫神經網路》電子書和《實戰Java虛擬機》一書。
郭超:就職于杭州市道路運輸管理局信息中心,主要從事大型交通管理系統的分布式管理和并發模型設計,對Java的研究比較深入,專注于分布式應用和并發應用。
第1章走入并行世界
1.1何去何從的并行計算
1.1.1忘掉那該死的并行
1.1.2可怕的現實:摩爾定律的失效
1.1.3柳暗花明:不斷地前進
1.1.4光明或是黑暗
1.2你必須知道的幾個概念
1.2.1同步(Synchronous)和異步(Asynchronous)
1.2.2并發(Concurrency)和并行(Parallelism)
1.2.3臨界區
1.2.4阻塞(Blocking)和非阻塞(Non-Blocking)
1.2.5死鎖(Deadlock)、饑餓(Starvation)和活鎖(Livelock)
1.3并發級別
1.3.1阻塞(Blocking)
1.3.2無饑餓(Starvation-Free)
1.3.3無障礙(Obstruction-Free)
1.3.4無鎖(Lock-Free)
1.3.5無等待(Wait-Free)
1.4有關并行的兩個重要定律
1.4.1Amdahl定律
1.4.2Gustafson定律
1.4.3Amdahl定律和Gustafson定律是否相互矛盾
1.5回到Java:JMM
1.5.1原子性(Atomicity)
1.5.2可見性(Visibility)
1.5.3有序性(Ordering)
1.5.4哪些指令不能重排:Happen-Before規則
1.6參考文獻
第2章Java并行程序基礎
2.1有關線程你必須知道的事
2.2初始線程:線程的基本操作
2.2.1新建線程
2.2.2終止線程
2.2.3線程中斷
2.2.4等待(wait)和通知(notify)
2.2.5掛起(suspend)和繼續執行(resume)線程
2.2.6等待線程結束(join)和謙讓(yield)
2.3volatile與Java內存模型(JMM)
2.4分門別類的管理:線程組
2.5駐守后臺:守護線程(Daemon)
2.6先干重要的事:線程優先級
2.7線程安全的概念與synchronized
2.8程序中的幽靈:隱蔽的錯誤
2.8.1無提示的錯誤案例
2.8.2并發下的ArrayList
2.8.3并發下詭異的HashMap
2.8.4初學者常見問題:錯誤的加鎖
2.9參考文獻
第3章JDK并發包
3.1多線程的團隊協作:同步控制
3.1.1synchronized的功能擴展:重入鎖
3.1.2重入鎖的好搭檔:Condition條件
3.1.3允許多個線程同時訪問:信號量(Semaphore)
3.1.4ReadWriteLock讀寫鎖
3.1.5器:CountDownLatch
3.1.6循環柵欄:CyclicBarrier
3.1.7線程阻塞工具類:LockSupport
3.2線程復用:線程池
3.2.1什么是線程池
3.2.2不要重復發明輪子:JDK對線程池的支持
3.2.3刨根究底:核心線程池的內部實現
3.2.4超負載了怎么辦:拒絕策略
3.2.5自定義線程創建:ThreadFactory
3.2.6我的應用我做主:擴展線程池
3.2.7合理的選擇:優化線程池線程數量
3.2.8堆棧去哪里了:在線程池中尋找堆棧
3.2.9分而治之:Fork/Join框架
3.3不要重復發明輪子:JDK的并發容器
3.3.1超好用的工具類:并發集合簡介
3.3.2線程安全的HashMap
3.3.3有關List的線程安全
3.3.4高效讀寫的隊列:深度剖析ConcurrentLinkedQueue
3.3.5高效讀取:不變模式下的CopyOnWriteArrayList
3.3.6數據共享通道:BlockingQueue
3.3.7隨機數據結構:跳表(SkipList)
3.4參考資料
第4章鎖的優化及注意事項
4.1有助于提高"鎖"性能的幾點建議
4.1.1減小鎖持有時間
4.1.2減小鎖粒度
4.1.3讀寫分離鎖來替換獨占鎖
4.1.4鎖分離
4.1.5鎖粗化
4.2Java虛擬機對鎖優化所做的努力
4.2.1鎖偏向
4.2.2輕量級鎖
4.2.3自旋鎖
4.2.4鎖消除
4.3人手一支筆:ThreadLocal
4.3.1ThreadLocal的簡單使用
4.3.2ThreadLocal的實現原理
4.3.3對性能有何幫助
4.4無鎖
4.4.1與眾不同的并發策略:比較交換(CAS)
4.4.2無鎖的線程安全整數:AtomicInteger
4.4.3Java中的指針:Unsafe類
4.4.4無鎖的對象引用:AtomicReference
4.4.5帶有時間戳的對象引用:AtomicStampedReference
4.4.6數組也能無鎖:AtomicIntegerArray
4.4.7讓普通變量也享受原子操作:AtomicIntegerFieldUpdater
4.4.8挑戰無鎖算法:無鎖的Vector實現
4.4.9讓線程之間互相幫助:細看SynchronousQueue的實現
4.5有關死鎖的問題
4.6參考文獻
第5章并行模式與算法
5.1探討單例模式
5.2不變模式
5.3生產者-消費者模式
5.4高性能的生產者-消費者:無鎖的實現
5.4.1無鎖的緩存框架:Disruptor
5.4.2用Disruptor實現生產者-消費者案例
5.4.3提高消費者的響應時間:選擇合適的策略
5.4.4CPU Cache的優化:解決偽共享問題
5.5Future模式
5.5.1Future模式的主要角色
5.5.2Future模式的簡單實現
5.5.3JDK中的Future模式
5.6并行流水線
5.7并行搜索
5.8并行排序
5.8.1分離數據相關性:奇偶交換排序
5.8.2改進的插入排序:希爾排序
5.9并行算法:矩陣乘法
5.10準備好了再通知我:網絡NIO
5.10.1基于Socket的服務端的多線程模式
5.10.2使用NIO進行網絡編程
5.10.3使用NIO來實現客戶端
5.11讀完了再通知我:AIO
5.11.1AIO EchoServer的實現
5.11.2AIO Echo客戶端實現
5.12參考文獻
第6章Java 8與并發
6.1Java 8的函數式編程簡介
6.1.1函數作為一等公民
6.1.2無副作用
6.1.3申明式的(Declarative)
6.1.4不變的對象
6.1.5易于并行
6.1.6更少的代碼
6.2函數式編程基礎
6.2.1FunctionalInterface注釋
6.2.2接口默認方法
6.2.3lambda表達式
6.2.4方法引用
6.3一步一步走入函數式編程
6.4并行流與并行排序
6.4.1使用并行流過濾數據
6.4.2從集合得到并行流
6.4.3并行排序
6.5增強的Future:CompletableFuture
6.5.1完成了就通知我
6.5.2異步執行任務
6.5.3流式調用
6.5.4CompletableFuture中的異常處理
6.5.5組合多個CompletableFuture
6.6讀寫鎖的改進:StampedLock
6.6.1StampedLock使用示例
6.6.2StampedLock的小陷阱
6.6.3有關StampedLock的實現思想
6.7原子類的增強
6.7.1更快的原子類:LongAdder
6.7.2LongAdder的功能增強版:LongAccumulator
6.8參考文獻
第7章使用Akka構建高并發程序
7.1新并發模型:Actor
7.2Akka之Hello World
7.3有關消息投遞的一些說明
7.4Actor的生命周期
7.5監督策略
7.6選擇Actor
7.7消息收件箱(Inbox)
7.8消息路由
7.9Actor的內置狀態轉換
7.10詢問模式:Actor中的Future
7.11多個Actor同時修改數據:Agent
7.12像數據庫一樣操作內存數據:軟件事務內存
……
4.4.6數組也能無鎖:AtomicIntegerArray
除了提供基本數據類型外,JDK還為我們準備了數組等復合結構。當前可用的原子數組有:AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray,分別表示整數數組、long型數組和普通的對象數組。
這里以AtomicIntegerArray為例,展示原子數組的使用方式。
AtomicIntegerArray本質上是對int[]類型的封裝,使用Unsafe類通過CAS的方式控制int[]在多線程下的安全性。它提供了以下幾個核心API:
//獲得數組第i個下標的元素
public final int get(int i)
//獲得數組的長度
public final int length()
//將數組第i個下標設置為newValue,并返回舊的值
public final int getAndSet(int i, int newValue)
//進行CAS操作,如果第i個下標的元素等于expect,則設置為update,設置成功返回true
public final boolean compareAndSet(int i, int expect, int update)
//將第i個下標的元素加1
public final int getAndIncrement(int i)
//將第i個下標的元素減1
public final int getAndDecrement(int i)
//將第i個下標的元素增加delta(delta可以是負數)
public final int getAndAdd(int i, int delta)4.4.6數組也能無鎖:AtomicIntegerArray
除了提供基本數據類型外,JDK還為我們準備了數組等復合結構。當前可用的原子數組有:AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray,分別表示整數數組、long型數組和普通的對象數組。
這里以AtomicIntegerArray為例,展示原子數組的使用方式。
AtomicIntegerArray本質上是對int[]類型的封裝,使用Unsafe類通過CAS的方式控制int[]在多線程下的安全性。它提供了以下幾個核心API:
//獲得數組第i個下標的元素
public final int get(int i)
//獲得數組的長度
public final int length()
//將數組第i個下標設置為newValue,并返回舊的值
public final int getAndSet(int i, int newValue)
//進行CAS操作,如果第i個下標的元素等于expect,則設置為update,設置成功返回true
public final boolean compareAndSet(int i, int expect, int update)
//將第i個下標的元素加1
public final int getAndIncrement(int i)
//將第i個下標的元素減1
public final int getAndDecrement(int i)
//將第i個下標的元素增加delta(delta可以是負數)
public final int getAndAdd(int i, int delta)
下面給出一個簡單的示例,展示AtomicIntegerArray的使用:
01 public class AtomicIntegerArrayDemo {
02 static AtomicIntegerArray arr = new AtomicIntegerArray(10);
03 public static class AddThread implements Runnable{
04 public void run(){
05 for(int k=0;k
06 arr.getAndIncrement(k%arr.length());
07 }
08 }
09 public static void main(String[] args) throws InterruptedException {
10 Thread[] ts=new Thread[10];
11 for(int k=0;k
12 ts[k]=new Thread(new AddThread());
13 }
14 for(int k=0;k
15 for(int k=0;k
16 System.out.println(arr);
17 }
18 }
上述代碼第2行,申明了一個內含10個元素的數組。第3行定義的線程對數組內10個元素進行累加操作,每個元素各加1000次。第11行,開啟10個這樣的線程。因此,可以預測,如果線程安全,數組內10個元素的值必然都是10000。反之,如果線程不安全,則部分或者全部數值會小于10000。
程序的輸出結果如下:
[10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000]
這說明AtomicIntegerArray確實合理地保障了數組的線程安全性。
好
整體感覺不錯
紙質差點,但挺清晰的,好評
書很喜歡喲
這本書不錯
還不錯 很有用~
包裝好,質量好,性價比超高,值得考慮。
贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊
很不錯,內容充實,講的都很專業
沒有包塑料皮,其他書都有,公司有一本這個書,寫的很好,所以自己就買了一本。實用性強,適用于至少有1年Java工作經驗的人,是一本值得看多遍的書。(快遞是指定周六周日送的,卻周二送了,批評)
講得并不深,還不如某些博客
贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊
贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊好
內容很好,講的知識點比較全面,通俗易懂,循序漸進,就是錯別字太多。
因為喜歡他的另一本書,性能優化的所以也要買下這本書,愛屋及烏
看了幾章感覺還不錯,實用技能類書籍還是很贊的。
我買個書居然給我發的是物流 結果還慢到死 如果下次當當發的還是這個物流直接退貨
書寫的不錯, 適合沒有多少并發經驗的java程序員閱讀, 結合源碼看效果更棒
不錯,之前看過很多原理性的東西,這次看一下在實際編碼中的運用.
并發現在愈來愈重要,因此這本書的內容很重要
很好的一本書,介紹的知識非常有用,看的出來作者是用心寫了。
程序員必看,沒事買來拓展下知識,懂得多才值錢!
看了個開頭,盡是引用的大佬理論。希望后面的內容多一些實用技巧。
看到“知其然,知其所以然”的人寫的并發的書。雖然有少量的錯別字,排版錯誤,整體瑕不掩瑜。
作者的功力很深,從jvm到并發的原理都有介紹,適合有Java經驗的人
很好的一本書,講的很好,比《java并發編程實戰》更適合入門~個人愚見,希望對買家有幫助!
通俗易懂 除了圖不是正規繪制之外,其他都不錯~偶爾有錯別字 無傷大雅 通向高級Java工程師的必經之路!