引言
今天是 2019 年最後一天,趁着中午喫飯的空擋,筆者寫了本文,算是給自己今年博客寫作畫上一個句號吧!
本章節來聊聊線程安全類的實現方式,日常開發中讀者可能都用過的,這裏作一個簡單的彙總。目前有幾種常用的線程安全類的實現方式,悉數如下:
- 設計不變的類,如枚舉類;
- 利用同步鎖來保證線程操作的安全性,參考示例如何實現線程安全的單例類;
- 使用
ThreadLocal
,每個線程維護自己的複本數據,避免共享數據;
如何設計不變類
併發環境中,一個類如果是不變的,那麼它一定就是線程安全的。這是設計模式中不變模式的一種:一個對象在創建之後,它的狀態就不會再發生變化,它就是不變類。
Java 中的 String
,各種基本類型的封裝類型,都是不變類。在設計任何一個類的時候,應當慎重考慮其狀態是否需要變化,如果其狀態沒有變化的必要,那麼就應當將它設計成不變類。
設計不變的類,應該限制成員變量的操作,只提供 get
方法,且所有引用屬性的訪問都使用拷貝,避免直接與外界發生聯繫。一個簡單的不變類編寫如下:
import java.util.Date;
/**
* 不可變對象定義,不提供set方法,避免外界對該對象屬性進行修改
* 對象中用到