1. 程式人生 > >圖解java多執行緒設計模式-第二章 Immutable模式

圖解java多執行緒設計模式-第二章 Immutable模式

以下內容是我在閱讀《圖解Java多執行緒設計模式》一書中的總結和思考

本章配圖文字是:想破壞也破壞不了。

定義

例項物件的內部狀態不會發生變化,也就是說不提供對外改變屬性的方法(除了建立物件時初始化的方法外),那麼這個類就是Immutable的,無需任何互斥操作都可以保證執行緒安全。

Immutable類的幾個常見特徵

  1. 宣告為final類:這樣是為了生成子類並修改屬性值的一種措施。
  2. private修飾屬性:防止子類修改屬性值,也防止例項物件修改屬性值。
  3. final修飾屬性值:說明屬性一旦賦值,就不再改變。其實這個final是為了突出這個類的意圖。

注意點:

  1. 如果一個類A的某個屬性是一個例項物件,那麼就要注意:如果該例項物件所屬的類不是immutable類,那麼這個類A也不一定是immutable類,就算該屬性被final修飾。
  2. 當使用建構函式來初始化屬性值的時候,如果入參不是immutable類,那麼初始化的時候就要使用synchronized,這樣才能保證初始化的時候要初始化的值不被修改。具體看課後最後一道練習題。

提及的JDK類包

  1. Thread.currentThread().getName():Thread.currentThread()返回當前執行緒的例項物件。然後再getName()獲取當前物件的名字。currentThread()是Thread的靜態方法,getName()是例項方法。
  2. String類是Immutable類,被final修飾的。String的值是放在常量池中的。所有的改動都會產生新的常量(當然是指常量池中找不到這個值的時候才會產生新的常量)。只有字串" "的相加才會只限於常量池的操作,一旦有new或者是有物件的相加就會重新new一個物件出來。
  3. BigInteger和BigDecimal都是immutable類。同理還有八個包裝類以及Pattern類。
  4. Collections.synchronizedList得到的list物件是執行緒安全的,但是該物件的迭代器不安全。
  5. java.util.concurrent.CopyOnWriteArrayList類是執行緒安全的,其迭代器也是執行緒安全的。