1. 程式人生 > >《Java併發程式設計實踐——第四章(組合物件)》

《Java併發程式設計實踐——第四章(組合物件)》

組合物件

我們不希望為了獲得執行緒安全而去每次分析記憶體訪問;而希望執行緒安全的元件能夠以安全的方式組合成更大的元件或程式。

4.1 設計執行緒安全的類

在這裡插入圖片描述

4.1.1 收集同步需求

在這裡插入圖片描述

4.1.2 狀態依賴的操作

在這裡插入圖片描述

4.1.3 狀態所有權

在這裡插入圖片描述

4.2 例項限制

即使一個物件不是執行緒安全的,你也可以讓他安全地用於多執行緒。
比如確保它只被單一的執行緒訪問,也可確保所有的訪問都正確地被鎖保護。
在這裡插入圖片描述

例項限制是構建執行緒安全類的最簡單方法之一。

4.2.1 Java監視器模式

物件封裝所有的可變狀態,並由自己的內部鎖保護。

4.2.2 範例:機動車追蹤器

先複製資料,再返回給使用者,這種實現方式部分地維護這執行緒安全。

4.3 委託執行緒安全

把執行緒的安全性委託給執行緒安全的類,就是委託執行緒安全。

4.3.2 非狀態依賴變數
4.3.3 當委託無法勝任時

在這裡插入圖片描述
狀態變數lower和upper不是彼此獨立的,不能將安全性委託個執行緒安全的狀態變數上。

在這裡插入圖片描述

4.3.4 釋出底層的狀態變數

在這裡插入圖片描述

4.4 向已有的執行緒安全類新增功能

直接向類中加入新方法,意味著所有實現類同步策略仍然包含在一個原始碼檔案中,便於理解和維護。但是通常不可能,無法操作原始類。
另一個方法是擴充套件類,可能會改變父類的同步策略。

4.4.1 客戶端加鎖

在這裡插入圖片描述
list操作聲明瞭synchronized,但是使用了不同的鎖,將意味著putIfAbsent對list的其他操作而言,並不是原子化。
正確的方法是使用相同的鎖:
在這裡插入圖片描述

4.4.2 組合

向已有的類中新增一個原子操作,還有更健壯的選擇:組合。
在這裡插入圖片描述
通過使用內部鎖,引入了一個新的鎖層。

4.5 同步策略的文件化