圖解java多執行緒設計模式-第二章 Immutable模式
阿新 • • 發佈:2018-12-22
以下內容是我在閱讀《圖解Java多執行緒設計模式》一書中的總結和思考
本章配圖文字是:想破壞也破壞不了。
定義
例項物件的內部狀態不會發生變化,也就是說不提供對外改變屬性的方法(除了建立物件時初始化的方法外),那麼這個類就是Immutable的,無需任何互斥操作都可以保證執行緒安全。
Immutable類的幾個常見特徵
- 宣告為final類:這樣是為了生成子類並修改屬性值的一種措施。
- private修飾屬性:防止子類修改屬性值,也防止例項物件修改屬性值。
- final修飾屬性值:說明屬性一旦賦值,就不再改變。其實這個final是為了突出這個類的意圖。
注意點:
- 如果一個類A的某個屬性是一個例項物件,那麼就要注意:如果該例項物件所屬的類不是immutable類,那麼這個類A也不一定是immutable類,就算該屬性被final修飾。
- 當使用建構函式來初始化屬性值的時候,如果入參不是immutable類,那麼初始化的時候就要使用synchronized,這樣才能保證初始化的時候要初始化的值不被修改。具體看課後最後一道練習題。
提及的JDK類包
- Thread.currentThread().getName():Thread.currentThread()返回當前執行緒的例項物件。然後再getName()獲取當前物件的名字。currentThread()是Thread的靜態方法,getName()是例項方法。
- String類是Immutable類,被final修飾的。String的值是放在常量池中的。所有的改動都會產生新的常量(當然是指常量池中找不到這個值的時候才會產生新的常量)。只有字串" "的相加才會只限於常量池的操作,一旦有new或者是有物件的相加就會重新new一個物件出來。
- BigInteger和BigDecimal都是immutable類。同理還有八個包裝類以及Pattern類。
- Collections.synchronizedList得到的list物件是執行緒安全的,但是該物件的迭代器不安全。
- java.util.concurrent.CopyOnWriteArrayList類是執行緒安全的,其迭代器也是執行緒安全的。