《Java多執行緒程式設計實戰》——第3章 Immutable Object(不可變物件)模式
阿新 • • 發佈:2018-12-04
通過使用對外可見的狀態不可變的物件,無需額外的同步訪問控制。既保證了資料一致性,又避免了同步訪問控制所產生的額外開銷和問題,也簡化了程式設計。
狀態不可變的物件:物件一經建立,其對外可見的狀態就保持不變,如String和Integer。
Immutable Object模式:將現實世界中狀態可變的實體建模為狀態不可變物件,並通過建立不同的狀態不可變物件來反映現實世界實體的狀態變更。
類圖
ImmutableObject:負責儲存一組不可變狀態
Manipulator:負責維護ImmutableObject所建模的現實世界實體狀態的變更。
不可變物件的使用主要包括以下幾種型別:
- 獲取單個狀態的值
- 獲取一組狀態的快照:防禦性複製/返回一個只讀的物件,避免對外洩露
- 生成新的不可變物件例項
一個嚴格意義上的不可變物件要滿足以下所有條件:
- 類本身使用final修飾:防止其子類改變其定義的行為
- 所有欄位都用final修飾:語義上說明欄位引用不可改變。在多執行緒環境下由JMM保證了被修飾字段所引用物件的初始化安全。
- 在物件建立過程中,this關鍵字沒有洩露,防止其他類(如該類的內部匿名類)在物件建立過程中修改其狀態
- 任何欄位,如果引用了其他狀態可變的物件(如集合、陣列等),則這些欄位必須是private修飾的,切欄位值不能對外暴露。如果要返回這些欄位值,應該進行防禦性複製
適用場景
- 被建模物件的狀態變化不頻繁:頻繁建立新的不可變物件,會增加垃圾回收的負擔和CPU消耗
- 同時對一組相關資料進行寫操作,需要保證原子性
JAVA標準庫例項
CopyOnWriteArrayList:專門針對遍歷比修改操作更加頻繁的場景