1.3 理解Singleton
延遲載入的思想: 通俗一點講, 就是一開始不要加載資源或者資料, 一直等到馬上就要使用這個資源或資料了, 躲不過去了, 才加載, 所以也稱lazy loading. 不是懶惰, 是延遲, 這在實際開發中是一種很常見的思維, 儘可能的節約資源.
快取(緩存)的思想: Lazy singleton其實還體現了快取的思想, 快取也是實際開發中常會見到的功能. 簡單來講就是說, 若某些資源或資料會被頻繁地使用, 就可以把這些東西快取至記憶體中, 每次操作的時候, 先去記憶體裡面找, 如果有就直接用, 反之則獲取之, 並設置到快取中. 如此一來, 下次存取的時候就可以直接從記憶體中獲取了, 從而節省了一些時間. 當然, 這是一種很典型的用空間換時間的方案.
Singleton的優缺點:
時間和空間: Lazy singleton是典型的時間換空間, eager singleton則是典型的空間換時間
Thread safe: 1. 不加同步的lazy singleton不是thread safe的, 所以記得在判斷實例是否為空之前加上synchronized即可 2. Eager singleton是thread safe的, 因為JVM保證了只會加載一次
雙重鎖定機制: 這種方式指的是, 並不是每次進入getInstance()都要同步, 而是先不同步, 進入方法過後, 先檢查實例是否存在, 若不存在才進入之後的同步區塊, 這是第一次檢查. 進入同步區塊後, 再次檢查實例是否存在, 如果不存在, 就在同步的情況下建立一個實例, 這是第二次檢查. 這樣一來, 就只需要同步一次了, 從而減少了多次在同步情況下進行判斷所浪費的時間 另外, 此種模式的實作中, 會使用關鍵字volatile, 其意思是: 被volatile修飾的變數, 將不會被local thread快取(緩存), 所有對該變數的讀寫都是直接操作shared memory, 從而確保多個執行緒能正確的處理該變數. 另外需要注意的是, 在Java1.4以及之前的版本中, 很多JVM對volatile的實作有問題, 會導致此機制的實作出現問題, 因此此種機制只能用在Java5以上的版本, 詳細內容請見1.6小節.
Last updated