并發模式與應用實踐 ( 簡體 字) |
作者:[印度] 阿圖爾·S.科德(Atul S. Khot) 著 | 類別:1. -> 程式設計 -> 綜合 |
譯者: |
出版社:機械工業出版社 | 3dWoo書號: 51314 詢問書籍請說出此書號!【有庫存】 NT售價: 395 元 |
出版日:6/1/2019 |
頁數:207 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787111625063 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:感謝你購買本書!我們生活在一個并發的世界中,并發編程是一項越來越有價值的技能。
我還記得當我理解了UNIX shell管道的工作原理的那一刻,便立即對Linux和命令行“一見鐘情”,并嘗試了許多通過管道連接的組合過濾器(過濾器是一種程序,它從標準輸入設備讀取數據,再寫入標準輸出設備)。我一直都在和并發程序打交道,我對命令行的創造性和力量感到很驚訝。
后來,由于項目變化,我致力于用多線程范式編寫代碼。所使用的編程語言是我鐘愛的C或C++,然而,令我驚訝的是,我發現維護一個用C/C++編寫的多線程遺留代碼庫是一項艱巨的任務。這是因為共享狀態是隨意管理的,一個小錯誤就可能讓我們陷入調試噩夢!
大約在那個時候,我開始了解面向對象設計模式和一些多線程模式。例如,我們希望將一個大的內存數據結構安全地顯露給多個線程。我讀過有關reader/writer鎖模式的內容,該模式使用智能指針(一種C++習語),并據此編寫解決方案。
采取此方法后并發錯誤就消失了!此外,該模式使得線程很容易理解。在我們的示例中,writer線程需要對共享數據結構進行不頻繁但獨占的訪問,reader線程只是將這個結構作為不可變的實體來使用。看啊,沒有鎖!
沒鎖帶來巨大的好處,隨著鎖的消失,死鎖、競爭和饑餓的可能性也隨之消失。感覺真棒!
我在這里得到了一個教訓!我得不斷學習設計模式,根據不同模式努力思考手邊的設計問題。這也幫助我更好地理解代碼!最終,我對如何馴服并發這頭野獸有了初步的了解!
設計模式是用于解決常見設計問題的可重復使用的解決方案。設計解決方案就是設計模式。你的問題領域可能會有所不同,也就是說,你需要編寫的業務邏輯將用于解決你手中的業務問題。但是,一旦使用模式,任務就能很快完成!
例如,當我們使用面向對象范式編寫代碼時,我們使用“四人組”(GoF)開發的設計模式(http://wiki.c2.com/?DesignPatternsBook)。這本名著為我們提供了一系列設計問題及其解決方案。雖然這種策略模式一直保持不變,但它仍被人們廣泛使用。
幾年后,我轉戰到Java領域,并使用ExecutorService接口來構建我的代碼。開發代碼非常容易,幾個月的運行中沒有出現任何重大問題。(雖然有一些其他問題,但沒有數據沖突,也沒有煩瑣的調試!)
隨后,我進入函數式編程的世界,并開始編寫越來越多的Scala程序。這是一個以不變數據結構為標準的新領域,我學到了一種截然不同的范式。
Scala的future模式和actor模式給出了全新的視角。作為程序員,我能感受到這些工具帶來的力量。一旦你跨越了認知曲線(誠然在開始時有點畏懼),就能編寫許多更安全且經得起推敲的并發代碼。
本書講述了許多并發設計模式,展示了這些模式背后的基本原理,突出了設計方案。
本書目標讀者
我們假定你有一定的Java編程基礎,理想情況下,你已經用過多線程Java程序,并熟悉“四人組”的設計模式,你還能輕松地通過maven運行Java程序。
本書將帶你進入下一個階段,同時向你展示許多并發模式背后的設計主題。本書希望幫助開發人員通過學習模式來構建可擴展、高性能的應用程序。
本書包含的內容
第1章介紹并發編程。正如你將看到的,并發本身就是一個領域。你將了解UNIX進程以及并發模式的管道和過濾器。本章涉及并發編程的綜述,你可能已對這方面有所了解。
第2章涵蓋一些關鍵的基本概念,并介紹Java內存模型的本質。你將了解共享狀態模型中出現的競爭條件和問題,并嘗試第一個并發模式:手拉手鎖定。
第3章包括顯式同步可變狀態和監視器模式,你會看到這種方法存在很多問題。我們將詳細介紹主動對象設計模式。
第4章介紹線程如何通過生產者/消費者模式相互通信,并介紹線程通信的概念,然后解釋主/從設計模式。本章還將介紹fork-join模式的一個特例:map-reduce模式。
第5章討論構建塊,還將討論阻塞隊列、有界隊列、鎖存器、FutureTask、信號量、屏障、激活和安全等內容。最后,描述不可變性以及不可變數據結構固有的線程安全性。
第6章介紹future并討論它的一元性質,包括轉型和單子模式,還將闡釋future模式的構成,同時會介紹Promise類。
第7章介紹actor范式。再次回顧主動對象模式,然后解釋actor范式,特別是未明確的鎖定性質。還將討論ask與tell、become模式(并強調其不變性)、流水線、半同步或半異步,并通過示例代碼進行說明。
讀者水平及所需環境
為了充分利用本書,你應該掌握一定水平的Java編程知識和Java線程基礎知識,能夠使用Java構建工具maven。書中提供了需要復習的重要內容,并通過Java線程示例對此進行補充。
使用諸如IntelliJ Idea、Eclipse或Netbeans等集成開發環境會很有幫助,但并非必須。為了說明函數并發模式,最后兩章使用Scala,這兩章的代碼使用基本的Scala結構。我們建議讀者最好瀏覽一下介紹性的Scala教程,這樣做很有益處。
下載示例代碼及彩色圖像
本書的示例代碼及所有截圖和樣圖。 |
內容簡介:本書詳細闡釋如何使用多線程、同步和函數式編程模式構建可擴展的應用程序,不僅涵蓋基本的并發概念、常用的多線程、同步和函數式編程模式等技術,還深入探討了不同的并發模型和并行算法及其在不同場景中的應用,此外提供了豐富的代碼示例,可以幫助你快速掌握并有效利用并發模式以解決實際的開發問題。
全書共7章,第1章概述并發編程,并介紹UNIX進程以及并發模式的管道和過濾器;第2章介紹一些關鍵的基本概念和Java內存模型的本質,你將了解共享狀態模型中出現的競爭條件和問題;第3章介紹其他同步模式,涉及有界緩沖區、讀寫鎖、計數信號量、倒計時鎖、循環屏障、future任務等;第4章討論線程池,涉及fork-join API、主動對象設計模式等主題;第5章介紹提高數據結構并發的各種策略,涉及無鎖堆棧和隊列、并發哈希算法、鎖條紋設計模式等;第6章討論函數式并發模式,并詳細介紹future模式;第7章討論actor模式和功能,涉及狀態封裝、become模式、基本的actor通信模式等。
選擇正確的并發體系結構對應用程序的設計和性能有重大影響,本書解釋了如何利用并行體系結構的不同特性來使代碼更快、更高效地運行。
書中全面闡述并發設計模式,并展示這些模式背后的基本原理及設計方案。首先介紹基本的并發概念,然后探索顯式鎖定、無鎖編程、future模式和actor模式;之后深入探討不同的并發模型和并行算法,并將它們應用于不同的實際場景中,以挖掘應用程序的真正潛力。本書幫助你完整了解多線程設計模式,比如主/從模式、leader/followers模式、map-reduce模式以及監視器模式,同時幫助你使用這些模式進行實際編碼。
通過閱讀本書,讀者將:
探索并行體系結構
熟悉并發模型
實現多線程模式以內化設計主題
深入了解并發設計模式
發現眾多Java線程抽象背后的設計原則
使用函數式并發模式 |
目錄:譯者序 前言 作者/評閱者簡介 第1章 并發簡介1 1.1 并發輕而易舉2 1.1.1 推動并發3 1.1.2 分時6 1.1.3 兩種并發編程模型7 1.2 消息傳遞模型8 1.2.1 協調和通信10 1.2.2 流控制12 1.2.3 分治策略14 1.2.4 進程狀態的概念15 1.3 共享內存和共享狀態模型16 1.3.1 線程交錯—同步的需要18 1.3.2 競爭條件和海森堡bug20 1.3.3 正確的內存可見性和happens-before原則21 1.3.4 共享、阻塞和公平22 1.3.5 異步與同步執行24 1.3.6 Java的非阻塞I/O25 1.4 模式和范式26 1.4.1 事件驅動的架構28 1.4.2 響應式編程29 1.4.3 actor范式31 1.4.4 消息代理32 1.4.5 軟件事務性內存33 1.4.6 并行集合34 1.5 本章小結35 第2章 并發模式初探37 2.1 線程及其上下文38 2.2 競爭條件40 2.2.1 監視器模式44 2.2.2 線程安全性、正確性和不變性45 2.2.3 雙重檢查鎖定48 2.2.4 顯式鎖定52 2.2.5 生產者/消費者模式60 2.2.6 比較和交換66 2.3 本章小結68 第3章 更多的線程模式70 3.1 有界緩沖區72 3.1.1 策略模式—客戶端輪詢74 3.1.2 接管輪詢和睡眠的策略75 3.1.3 使用條件變量的策略77 3.2 讀寫鎖78 3.2.1 易讀的RW鎖80 3.2.2 公平鎖84 3.3 計數信號量86 3.4 我們自己的重入鎖89 3.5 倒計時鎖存器91 3.6 循環屏障95 3.7 future任務97 3.8 本章小結100 第4章 線程池101 4.1 線程池102 4.1.1 命令設計模式104 4.1.2 單詞統計105 4.1.3 單詞統計的另一個版本107 4.1.4 阻塞隊列107 4.1.5 線程中斷語義111 4.2 fork-join池111 4.2.1 Egrep—簡易版112 4.2.2 為什么要使用遞歸任務113 4.2.3 任務并行性116 4.2.4 使用fork-join API實現快速排序117 4.2.5 map-reduce技術124 4.3 線程的工作竊取算法125 4.4 主動對象128 4.4.1 隱藏和適應129 4.4.2 使用代理129 4.5 本章小結132 第5章 提升并發性133 5.1 無鎖堆棧134 5.1.1 原子引用134 5.1.2 堆棧的實現135 5.2 無鎖的FIFO隊列137 5.2.1 流程如何運作140 5.2.2 無鎖隊列141 5.2.3 ABA問題147 5.3 并發的哈希算法152 5.3.1 add(v)方法153 5.3.2 contains(v)方法156 5.4 大鎖的方法157 5.5 鎖條紋設計模式159 5.6 本章小結162 第6章 函數式并發模式163 6.1 不變性164 6.1.1 不可修改的包裝器165 6.1.2 持久數據結構167 6.1.3 遞歸和不變性169 6.2 future模式170 6.2.1 apply方法171 6.2.2 future—線程映射173 6.2.3 future模式是異步的174 6.2.4 糟糕的阻塞177 6.2.5 函數組合179 6.3 本章小結182 第7章 actor模式183 7.1 消息驅動的并發183 7.1.1 什么是actor185 7.1.2 狀態封裝189 7.1.3 并行性在哪里190 7.1.4 未處理的消息192 7.1.5 become模式193 7.1.6 讓它崩潰并恢復197 7.1.7 actor通信—ask模式199 7.1.8 actor通信—tell模式204 7.1.9 pipeTo模式205 7.2 本章小結207 |
序: |