線程特有對象
我們可以選擇不共享非線程安全的對象,對于非線程安全的對象,每個線程都創建一個該對象的實例,各個線程線程訪問各自創建的實例,一個線程不能訪問另外一個線程創建的實例. 這種各個線程創建各自的實例,一個實例只能被一個線程訪問的對象就稱為線程特有對象. 線程特有對象既保障了對非線程安全對象的訪問的線程安全,又避免了鎖的開銷.線程特有對象也具有固有的線程安全性。
ThreadLocal類相當于線程訪問其特有對象的代理,即各個線程通過ThreadLocal對象可以創建并訪問各自的線程特有對象,泛型T指定了線程特有對象的類型. 一個線程可以使用不同的ThreadLocal實例來創建并訪問不同的線程特有對象。
ThreadLocal實例為每個訪問它的線程都關聯了一個該線程特有的對象, ThreadLocal實例都有當前線程與特有實例之間的一個關聯。
裝飾器模式可以用來實現線程安全,基本思想是為非線程安全的對象創建一個相應的線程安全的外包裝對象,客戶端代碼不直接訪問非線程安全的對象而是訪問它的外包裝對象. 外包裝對象與非線程安全的對象具有相同的接口,即外包裝對象的使用方式與非線程安全對象的使用方式相同,而外包裝對象內部通常會借助鎖,以線程安全的方式調用相應的非線程安全對象的方法。
在java.util.Collections工具類中提供了一組synchronizedXXX(xxx)可以把不是線程安全的xxx集合轉換為線程安全的集合,它就是采用了這種裝飾器模式. 這個方法返回值就是指定集合的外包裝對象.這類集合又稱為同步集合。
使用裝飾器模式的一個好處就是實現關注點分離,在這種設計中,實現同一組功能的對象的兩個版本:非線程安全的對象與線程安全的對象. 對于非線程安全的在設計時只關注要實現的功能,對于線程安全的版本只關注線程安全性。