《Java併發程式設計實踐——第四章(組合物件)》
阿新 • • 發佈:2018-11-17
組合物件
我們不希望為了獲得執行緒安全而去每次分析記憶體訪問;而希望執行緒安全的元件能夠以安全的方式組合成更大的元件或程式。
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 組合
向已有的類中新增一個原子操作,還有更健壯的選擇:組合。
通過使用內部鎖,引入了一個新的鎖層。