1. 程式人生 > >《Java多執行緒程式設計實戰》——第3章 Immutable Object(不可變物件)模式

《Java多執行緒程式設計實戰》——第3章 Immutable Object(不可變物件)模式

通過使用對外可見的狀態不可變的物件,無需額外的同步訪問控制。既保證了資料一致性,又避免了同步訪問控制所產生的額外開銷和問題,也簡化了程式設計。
狀態不可變的物件:物件一經建立,其對外可見的狀態就保持不變,如String和Integer。
Immutable Object模式:將現實世界中狀態可變的實體建模為狀態不可變物件,並通過建立不同的狀態不可變物件來反映現實世界實體的狀態變更

類圖

ImmutableObject:負責儲存一組不可變狀態
Manipulator:負責維護ImmutableObject所建模的現實世界實體狀態的變更。

不可變物件的使用主要包括以下幾種型別:

  • 獲取單個狀態的值
  • 獲取一組狀態的快照:防禦性複製/返回一個只讀的物件,避免對外洩露
  • 生成新的不可變物件例項

一個嚴格意義上的不可變物件要滿足以下所有條件:

  1. 類本身使用final修飾:防止其子類改變其定義的行為
  2. 所有欄位都用final修飾:語義上說明欄位引用不可改變。在多執行緒環境下由JMM保證了被修飾字段所引用物件的初始化安全
  3. 在物件建立過程中,this關鍵字沒有洩露,防止其他類(如該類的內部匿名類)在物件建立過程中修改其狀態
  4. 任何欄位,如果引用了其他狀態可變的物件(如集合、陣列等),則這些欄位必須是private修飾的,切欄位值不能對外暴露。如果要返回這些欄位值,應該進行防禦性複製

適用場景

  • 被建模物件的狀態變化不頻繁:頻繁建立新的不可變物件,會增加垃圾回收的負擔和CPU消耗
  • 同時對一組相關資料進行寫操作,需要保證原子性

JAVA標準庫例項

CopyOnWriteArrayList:專門針對遍歷比修改操作更加頻繁的場景