《深入理解Go並發編程:從原理到實踐,看這本就夠了》是電子工業出版社出版圖書,作者晁岳攀(@鳥窩)。
基本介紹
- 中文名:深入理解Go並發編程:從原理到實踐,看這本就夠了
- 作者:晁岳攀(@鳥窩)
- 出版時間:2023年11月
- 出版社:電子工業出版社
- 頁數:416 頁
- ISBN:9787121466465
- 定價:158 元
- 開本:16 開
內容簡介,圖書目錄,作者簡介,
內容簡介
《深入理解Go並發編程:從原理到實踐,看這本就夠了》分為四大部分。第1部分包括第1~13章,主要介紹Go標準庫的同步原語,包括互斥鎖Mutex、讀寫鎖RWMutex、WaitGroup、條件變數Cond、Once、Map、Pool、Context、channel等,以及最新的原子操作知識,其中重點介紹了channel,最後還介紹了Go的記憶體模 型。第2部分包括第14~18章,主要介紹Go官方的擴展庫和第三方的同步原語,包括信號量、SingleFlight、CyclicBarrier、分組操作庫、限流庫等。第3部分包括第19章,主要介紹基於etcd的分散式同步(並發)原語。第4部分包括第20章和第21章,主要歸納總結Go的併發模式,並嘗試使用本書介紹的同步原語解決經典的並發問題。
《深入理解Go並發編程:從原理到實踐,看這本就夠了》主要面向的是已經具有Go軟體編程開發經驗的工程師、基礎架構軟體開發工程師和架構師,需要初步和深入了解Go並發編程的相關知識,設計和實現高並發的基礎軟體與分散式系統的專業人員,以及對Go並發感興趣的讀者。
圖書目錄
第1章 Go並發編程和調度器
1.1 Go特別適合併發編程
1.2 並發 vs 並行
1.3 阿姆達爾定律:並發編程最佳化是有上限的
1.4 Go並發並不一定最快
1.5 Go運行時調度器
第2章 互斥鎖Mutex
2.1 競爭條件與數據競爭
2.2 Mutex的用法
2.2.1 一個並發問題
2.2.2 Mutex的使用
2.2.3 地道的用法
2.3 檢查程式中的數據競爭
2.4 Mutex的歷史實現
2.4.1 初始版本
2.4.2 多給新的 goroutine 一些機會
2.4.3 多給競爭者一些機會
2.4.4 解決飢餓問題
2.4.5 TryLock
2.5 Mutex的使用陷阱
2.5.1 誤寫
2.5.2 死鎖
2.5.3 鎖重入
2.5.4 複製鎖
2.6 Mutex的擴展
2.6.1 可重入鎖
2.6.2 支持並發 map
2.6.3 封裝值
第3章 讀寫鎖 RWMutex
3.1 讀寫鎖的使用場景
3.2 讀寫鎖的使用方法
3.3 讀寫鎖的實現
3.3.1 RLock的實現
3.3.2 RUnlock的實現
3.3.3 Lock的實現
3.3.4 Unlock的實現
3.3.5 TryLock的實現
3.3.6 TryRLock的實現
3.4 讀寫鎖的使用陷阱
3.4.1 鎖重入
3.4.2 死鎖
3.4.3 發現死鎖
3.5 讀寫鎖的擴展
第4章 任務編排好幫手 WaitGroup
4.1 WaitGroup的使用方法
4.2 WaitGroup的實現
4.3 WaitGroup的使用陷阱
4.3.1 Add 方法調用的時機不對
4.3.2 計數器的值為負數
4.3.3 錯誤的調用 Add的時機
4.3.4 知名項目中關於 WaitGroup 使用的 bug
4.4 WaitGroup的擴展
4.5 noCopy:輔助 vet 檢查
第5章 條件變數 Cond
5.1 Cond的使用方法
5.2 Cond的實現
5.3 Cond的使用陷阱
5.3.1 調用 Wait 時沒有加鎖
5.3.2 喚醒之後不檢查判斷條件
5.4 在實際項目中使用 Cond的例子
第6章 單例化利器 Once
6.1 Once的使用方法
6.2 Once的實現
6.3 Once的使用陷阱
6.3.1 死鎖
6.3.2 未初始化
第7章 並發 map
7.1 執行緒安全的 map
7.1.1 使用 map的兩種常見錯誤
7.1.2 加讀寫鎖:擴展 map,支持並發讀/寫
7.2 sync.Map的使用方法
7.3 sync.Map的實現
7.3.1 Swap 方法
7.3.2 Load 方法
7.3.3 Delete 方法
7.4 分片加鎖:更高效的並發map
7.5 lock-free map
第8章 池 Pool
8.1 sync.Pool的使用方法
8.2 sync.Pool的實現
8.2.1 Get 方法的實現
8.2.2 Put 方法的實現
8.3 sync.Pool的使用陷阱
8.4 連線池
8.4.1 標準庫中的 HTTP Client 池
8.4.2 資料庫連線池
8.4.3 TCP 連 接池
8.4.4 Memcached Client 連線池
8.4.5 net/rpc 中的 Request/Response 對象池
8.5 goroutine/worker 池
第9章 不止是上下文:Context
9.1 Context的發展歷史
9.2 Context的使用方法
9.2.1 基本用法
9.2.2 傳遞上下文
9.2.3 可撤銷的上下文
9.2.4 帶逾時功能的上下文
9.3 Context 實戰
9.4 Context的使用陷阱
9.5 Context的實現
9.5.1 WithValue的實現
9.5.2 WithCancel的實現
9.5.3 WithDeadline的實現
第10章 原子操作
10.1 原子操作的基礎知識
10.2 原子操作的使用場景
10.3 atomic 提供的函式和類型
10.3.1 AddXXX函式
10.3.2 CompareAndSwapXXX函式
10.3.3 SwapXXX函式
10.3.4 LoadXXX函式
10.3.5 StoreXXX函式
10.3.6 Value 類型
10.3.7 Bool、Int32、Int64、Pointer、Uint32、Uint64、Uintptr
10.4 uber-go/atomic 庫
10.5 lock-free 佇列的實現
10.6 原子性和可見性
第11章 channel 基礎:另闢蹊徑解決並發問題
11.1 channel的歷史
11.2 channel的套用場景
11.3 channel的基本用法
11.4 channel的實現
11.4.1 channel的數據結構
11.4.2 初始化
11.4.3 傳送數據
11.4.4 接收數據
11.4.5 關閉 channel
11.5 channel的使用陷阱 / 224
11.5.1 panic 和 goroutine 泄漏
11.5.2 知名項目踩過的坑
第12章 channel的內部實現和陷阱
12.1 使用反射操作 select 和 channel
12.2 channel的套用場景
第13章 Go記憶體模型
13.1 指令重排和可見性的問題
13.2 sequenced before、synchronized before 和 happens before
13.3 各種同步原語的同步保證
13.3.1 初始化
13.3.2 goroutine的運行
13.3.3 channel
13.3.4 鎖(Mutex 和 RWMutex)
13.3.5 Once
13.3.6 WaitGroup
13.3.7 atomic操作
13.3.8 Finalizer、sync.Cond、sync.Map 和 sync.Pool
13.4 不正確的同步
第14章 信號量 Semaphore
14.1 什麼是信號量
14.1.1 P/V 操作
14.1.2 信號量和互斥鎖的區別與聯繫
14.2 信號量的 channel 實現
14.3 Go官方的信號量實現
14.4 使用信號量的常見錯誤
第15章 緩解壓力利器 SingleFlight
15.1 SingleFlight的實現
15.2 SingleFlight的使用場景
第16章 循環屏障 CyclicBarrier
16.1 CyclicBarrier的使用場景
16.2 CyclicBarrier的實現
16.3 使用 CyclicBarrier的例子
第17章 分組操作
17.1 ErrGroup
17.1.1 ErrGroup的基本用法
17.1.2 ErrGroup 使用示例
17.2 其他實用的 Group 同步原語
17.2.1 SizedGroup/ErrSizedGroup
17.2.2 gollback
17.2.3 Hunch
17.2.4 schedgroup
第18章 限流
18.1 基於令牌桶實現的限流庫
18.1.1 x/time/rate
18.1.2 juju/ratelimit
18.2 基於漏桶實現的限流庫
18.3 分散式限流
第19章 Go並發編程和調度器
19.1 Leader 選舉
19.1.1 選舉
19.1.2 查詢
19.1.3 監控
19.2 鎖 Locker
19.3 互斥鎖 Mutex
19.4 讀寫鎖 RWMutex
19.5 分散式佇列和優先權佇列
19.6 分散式屏障 / 340
19.7 計數型屏障 / 342
19.8 軟體事務記憶體
第20章 併發模式
20.1 併發模式概述
20.2 半異步 / 半同步模式
20.3 活動對象模式
20.4 斷路器模式
20.5 截止時間和逾時模式
20.6 迴避模式
20.7 雙重檢查模式
20.8 保護式掛起模式
20.9 核反應模式
20.10 調度器模式
20.11 反應器模式
20.12 Proactor模式
20.13 percpu模式
20.14 多進程模式
第21章 經典並發問題解析
21.1 哲學家就餐問題
21.1.1 模擬哲學家就餐問題
21.1.2 解法一:限制就餐人數
21.1.3 解法二:奇偶處理方法
21.1.4 解法三:資源分級
21.1.5 解法四:引入服務生
21.2 理髮師問題
21.2.1 使用 sync.Cond 解決理髮師問題
21.2.2 使用 channel 實現信號量
21.2.3 有多個理髮師的情況
21.3 水工廠問題
21.4 fizz buzz 問題
21.4.1 將並發轉為串列
21.4.2 使用同一個channel
21.4.3 使用CyclicBarrier
作者簡介
晁岳攀(@鳥窩),rpcx微服務框架作者,Go語言布道師,技術專欄作家。