clean code-代碼整潔之道 閱讀筆記(第十三章)

第十三章 并發編程

"對象是過程的抽象。線程是調度的抽象。"

--James O Coplien

13.1 為什么要并發?

????????并發是一種解耦策略。它幫助我們把做什么(目的)和何時(時機)做分解開。在單線
程應用中,目的與時機緊密耦合,很多時候只要查看堆棧追路即可斷定應用程序的狀態。

????????解耦目的與時機能明顯地改進應用程序的吞吐量和結構。從結構的角度來看,應用程序看起來更像是許多臺協同工作的計算機,而不是一個大循環。系統因此會更易于被理解,給出了許多切分關注面的有力手段。

迷思與誤解
  1. 并發總能改進性能
  2. 編寫并發程序無需修改設計
  3. 在采用Web或EJB容器的時候,理解并發問題并不重要

中肯說法

  1. 并發會在性能和編寫額外代碼上增加一些開銷
  2. 正確的并發是復雜的,即便對于簡單的問題也是如此;
  3. 并發缺陷并非總能重現,所以常被看做偶發事件而忽略,未被當做真正的缺陷看待;
  4. 并發常常需要對設計策略的根本性修改
13.2 挑戰
public class X{private int lastIdUsed;public int getNextId(){return ++lastIdUsed;}
}

比如,創建x的一個實體,將lastIdUsed設置為42,在兩個線程中共享這個實體。假設這兩個線程都調用getNextId()方法,結果可能有三種輸出:

  • 線程一得到值43,線程二得到值44,lastIdUsed為44;
  • 線程一得到值44,線程二得到值43,lastIdUsed為44;
  • 線程一得到值43,線程二得到值43,lastIdUsed為43。

????????就生成的字節碼而言,對于在getNextId方法中執行的那兩個線程,有12870種不同的可能執行路徑。如果lastIdUsed的類型從int變為long,則可能路徑的數量將增至2704156種。當然,多數路徑都得到正確結果。問題是其中一些不能得到正確結果。

13.3 并發防御原則
13.3.1 單一權責原則

問題:

  • 并發相關代碼有自己的開發、修改和調優生命周期;
  • 開發相關代碼有自己要對付的挑戰,和非并發相關代碼不同,而且往往更為困難;
  • 即便沒有周邊應用程序增加的負擔,寫得不好的并發代碼可能的出錯方式數量也已經足具挑戰性。

建議:分離并發相關代碼與其他代碼。

13.3.2 推論:限制數據作用域

????????兩個線程修改共享對象的同一字段時,可能互相干擾,導致未預期的行為。解決方案之一是采用synchronized關鍵字在代碼中保護一塊使用共享對象的臨界區(criticalsection)。

可能出現的問題:

  1. 你會忘記保護一個或多個臨界區——破壞了修改共享數據的代碼碼;
  2. 得多花力氣保證一切都受到有效防護(破壞了DRY原則);
  3. 很難找到錯誤源,也很難判斷錯誤源。

建議:謹記數據封裝;嚴格限制對可能被共享的數據的訪問。

13.3.3 推論:使用數據復本

????????避免共享數據的好方法之一就是一開始就避免共享數據。在某些情形下,有可能復制對象并以只讀方式對待。在另外的情況下,有可能復制對象,從多個個線程收集所有復本的結果,并在單個線程中合并這些結果。

13.3.4 推論:線程應盡可能地獨立

????????讓每個線程在自己的世界中存在,不與其他線程共享數據。每個線程處理一個客戶端請求,從不共享的源頭接納所有請求數據,存儲為本地變量。這樣一來,每個線程都像是世界中的唯一線程,沒有同步需要。

建議:嘗試將數據分解到可被獨立線程(可能在不同處理器上)操作的獨立子集。

13.4 了解Java庫
  • 使用類庫提供的線程安全群集;
  • 使用executor框架(executorframework)執行無關任務;
  • 盡可能使用非鎖定解決方案;
  • 有幾個類并不是線程安全的。
13.5 了解執行模型

13.5.1 生產者-消費者模型

????????生產者和消費者之間的隊列是一種限定資源。

13.5.2 讀者-作者模型

????????當存在一個主要為讀者線程提供信息源,但只偶爾被作者線程更更新的共享資源,吞吐量就會是個問題。增加吞吐量,會導致線程饑餓和過時信息的累積。更新會影響吞吐量。

????????挑戰之處在于平衡讀者線程和作者線程的需求,實現正確操作,提供合理的吞吐量,避免線程饑餓。

13.5.3 宴席哲學家

????????如果沒有用心設計,這種競爭式系統就會遭遇死鎖、活鎖、吞吐量和效率降低等問題。

可能遇到的并發問題,大多數都是這三個問題的變種。

建議:學習這些基礎算法,理解其解決方案。

13.6 警惕同步方法之間的依賴

????????建議:避免使用一個共享對象的多個方法。

必須使用一個共享對象的多個方法的3種手段:

  1. 基于客戶端的鎖定——客戶端代碼在調用第一個方法前鎖定服務端,確保鎖的范圍覆蓋了調用最后一個方法的代碼;
  2. 基于服務端的鎖定——在服務端內創建鎖定服務端的方法,調用所有方法,然后解鎖。讓客戶端代碼調用新方法;
  3. 適配服務端——創建執行鎖定的中間層。這是一種基于服務端的的鎖定的例子,但不修改原始服務端代碼。
13.7 保持同步區域微小

????????關鍵字synchronized制造了鎖。鎖是昂貴的,因為它們帶來了延遲和額外開銷。

????????另一方面,臨界區應該被保護起來。所以,應該盡可能少地設計臨界區。

????????將同步延展到最小臨界區范圍之外,會增加資源爭用、降低執行效率。

13.8 很難編寫正確的關閉代碼

????????平靜關閉很難做到。常見問題與死鎖有關,線程一直等待永遠不會到來的信號。

????????建議:盡早考慮關閉問題,盡早令其工作正常。這會花費比你預期更多的時間。檢視既有算法,因為這可能會比想象中難得多。

13.9 測試線程代碼

????????建議:編寫有潛力曝露問題的測試,在不同的編程配置、系統配置和負載條件下頻繁運行。如果測試失敗,跟蹤錯誤。別因為后來測試通過了后來的運行就忽略失敗。

  • 將偽失敗看作可能的線程問題?=> 不要將系統錯誤歸咎于偶發事件
  • 先使非線程代碼可工作?=> 不要同時追蹤非線程缺陷和線程缺陷。
  • 編寫可插拔的線程代碼
  • 編寫可調整的線程代碼
  • 運行多于處理器數量的線程
  • 在不同平臺上運行
  • 調整代碼并強迫錯誤發生。
13.10 小結

????????第一要訣是遵循單一權責原則。

????????了解并發問題的可能原因。

????????學習類庫,了解基本算法。

????????學習如何找到必須鎖定的代碼區域并鎖定之。不要鎖定不必針鎖定的代碼。

????????要能在不同平臺上、以不同配置持續重復運行線程代碼。

???????如果花點時間裝置代碼,就能極大地提升發現錯誤代碼的機會。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/34947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/34947.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/34947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【OpenCV 圖像處理 Python版】OpenCV 簡介及安裝

文章目錄 1.OpenCV 介紹1.1 OpenCV 的特點1.2 OpenCV 的主要模塊1.3 OpenCV 的應用場景 2.OpenCV-Python 庫3.OpenCV 安裝 1.OpenCV 介紹 OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫。它由英特爾公司于1999年…

API的優勢及應用場景(淘寶API測試的詳細步驟)

一、API的優勢 API的出現為應用程序間的通信提供了一種新的方式,它有以下優勢: 1、降低開發難度 開發者可以通過API訪問其他應用程序的數據和功能,避免了重復開發,降低了開發難度。 2、提高開發效率 API提供了一種標準化的通…

Transformer 模型全解析:NLP領域的變革者與任務精粹

標題:Transformer 模型全解析:NLP領域的變革者與任務精粹 引言 Transformer 模型自問世以來,已成為自然語言處理(NLP)領域的一大突破,其基于自注意力機制的架構為各種語言任務帶來了革命性的進展。本文將…

使用AES,前端加密,后端解密,spring工具類,直接c就完事了

學習python的時候,看到很多會對參數進行加密,于是好奇心驅使下,讓我去了解了下AES加密如何在java中實現。 首先 npm install crypto-js 然后在你的方法中,給你們前端源碼看看,因為我用的ruoyi框架做的實驗&#xff…

Java中的消息隊列與事件總線設計

Java中的消息隊列與事件總線設計 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將探討Java中的消息隊列與事件總線設計,這兩者在現代分布式…

構建一個檢索增強生成(RAG)應用程序

:::tips 此文檔是LangChain官方教程的實踐總結:https://python.langchain.com/v0.2/docs/tutorials/rag/實踐前你需要準備:OPENAI_API_KEY Generator:根據檢索到的信息和用戶的查詢生成自然語言的回答。LANGCHAIN_API_KEY 密切監控和評估您的…

【自然語言處理系列】掌握NLP基礎:去停用詞、詞性標注與命名實體識別實戰教程

摘要:本系列教程專注于自然語言處理(NLP)中的基礎元素,包括去停用詞、詞性標注以及命名實體識別。這些步驟是文本預處理和分析不可或缺的組成部分。我們將通過具體的實例和技術演示,講解如何使用Python及其相關庫&…

網絡安全之Windows提權(上篇)(高級進階)

目錄 一,什么是提權? 二,提權的前提 三,如何提權? 1,第一步連接服務器 2,提升權限至iuser?編輯 3,利用補丁漏洞提權至最高級 四,總結 一,什么是提權&am…

大數據集群數據傳輸

簡單的服務器間的通信示例 netcat,簡寫為 nc,是 unix 系統下一個強大的命令行網絡通信工具,用于在兩臺主機之間建立 TCP 或者 UDP 連接,并提供豐富的命令進行數據通信。nc 在網絡參考模型屬于應用層。使用 nc 可以做很多事情&…

docker-compose 之 達夢數據庫(dm8-v202406版)

1、達夢官方沒有提供鏡像直接 pull 的方式,提供的是鏡像的 tar 包,所以需要先去官網下載tar包。 2、然后使用如下 docker load 命令導入鏡像到服務上: docker load -i dm8_20240422_x86_rh6_64_rq_std_8.1.3.100_pack2.tar導入完成后&#…

重磅丨上海容大推出“容聆”智能拾音工牌,賦能線下門店運營數字化

近日,繼豚音營業廳智能質檢終端之后,上海容大數字技術有限公司(簡稱“上海容大”)在線下面對面溝通場景下語音數據采集與智能分析領域取得了新突破,重磅推出AI智能語音工牌產品——“容聆”。 據悉,“容聆”…

mybatis x插件的使用教程(詳細)

MyBatisX 的主要功能 代碼生成: 自動生成 MyBatis 的 Mapper、XML 配置文件和實體類,大大減少手工編寫代碼的工作量。 智能代碼補全: 提供 SQL 語句和 MyBatis 配置的智能代碼補全功能,使開發者能夠更快地編寫代碼。 代碼導航&…

鈾的危害和應用,以及鈾的分離提純

鈾是一種錒系放射性元素,對人體存在一定的危害,如輻射損傷、呼吸系統損傷、神經系統損傷、免疫系統損傷等。 1、輻射損傷:鈾的放射性會對人體產生輻射損傷,長期接觸會增加患癌癥的風險。此外,還可能對人體正常細胞產生…

【網絡安全的神秘世界】解決dvwa靶場報錯:Illegal mix of collations for operation ‘UNION‘

🌝博客主頁:泥菩薩 💖專欄:Linux探索之旅 | 網絡安全的神秘世界 | 專接本 | 每天學會一個滲透測試工具 🚩問題描述 當嘗試執行如下 SQL 語句時: 1 union select schema_name,1 from information_schema.s…

如何挑選護眼燈?一分鐘帶你了解挑選護眼燈的六大準則!

小時候,對正確用眼知識一無所知,也不明白何種光線環境對眼睛最為友善,結果如今的近視度數已瀕臨千度大關。雖然早已習慣佩戴眼鏡的生活,但近視所帶來的諸多不便仍舊在日常生活中無處不在。因此,對于家中孩子的視力健康…

第六十七:iview的select組件在頁面上,下拉數據被遮擋

iview的select組件在頁面上,下拉數據被遮擋 加上**:transfer"true"** 代碼截圖: 官方解說截圖:因為默認值是false 所以要改成:transfer“true”

人工智能水平國際領先,科大訊飛再獲國家科學技術進步獎一等獎

科大訊飛在2023年6月24日榮獲國家科學技術進步獎一等獎,這是對其在多語種智能語音技術及產業化領域取得的突破性成果的高度認可。科大訊飛的這一成就,標志著其在人工智能領域的技術實力和創新能力已達到國際領先水平。 據「TMT星球」了解,科大…

WMV 視頻格式怎么轉換?WMV 視頻為什么不流行了?

目前有越來越多的視頻格式類型,如常見的 MP4、FLV、AVI 等等,而技術的演變也逐漸讓一些常見的視頻格式變的越來越少了。 今天我們一起來聊下 WMV 這個視頻格式,讓我們看看它的發展以及為什么現在越來越少人使用了。 什么是 WMV 視頻格式&…

Git 使用指南(附詳細解釋)

Git 是一個強大的版本控制系統,廣泛用于軟件開發中,用于跟蹤文件的更改、協作工作等。無論你是新手還是有經驗的開發者,掌握 Git 都是非常有益的。這篇博客將帶你了解 Git 的基本使用,希望能幫助你快速入門并有效使用 Git。 1. 創…

論文學習_Nebula: Self-Attention for Dynamic Malware Analysis

論文名稱發表時間發表期刊期刊等級研究單位Nebula: Self-Attention for Dynamic Malware Analysis2024年IEEE TIFSCCF A熱那亞大學1. 引言 研究背景與現存問題:動態惡意軟件分析是一項至關重要的任務,不僅對于檢測而且對于了解整個互聯網上廣泛傳播的威脅而言。 收集樣本后,…