由於設計模式對於java高級開發人員來說是非常重要的,網上也有很多關於設計模式的文章,博客等。所以,首先我對相對簡單的單例模式做一個簡單的總結。 一、實現方式 單例模式的實現方式有3種,分別是餓漢式,懶漢式,IoDH這3種,下麵分別介紹下每種的實現原理和優缺點。 a)餓漢式 實現原理:類具有一個靜態 ...
由於設計模式對於java高級開發人員來說是非常重要的,網上也有很多關於設計模式的文章,博客等。所以,首先我對相對簡單的單例模式做一個簡單的總結。
一、實現方式
單例模式的實現方式有3種,分別是餓漢式,懶漢式,IoDH這3種,下麵分別介紹下每種的實現原理和優缺點。
a)餓漢式
實現原理:類具有一個靜態成員變數,且初始化的值是一個實例化的對象本身。
優點:即使多線程併發訪問也可確保只有一個唯一的對象;在獲取對象時候,可以快速響應。
缺點:類載入時就創建了對象,導致資源利用率不高。
b)懶漢式
實現原理:在靜態方法里創建對象;成員變數用volatile修飾,方法用通過雙重檢查鎖定實現。
優點:延遲載入,提升了記憶體資源利用率。
缺點:因volatile關鍵字會屏蔽java虛擬機做的一些代碼優化,所以系統運行效率降低。
c)IoDH (Initialization Demand Holder)
實現原理:添加一個靜態內部類,在該內部類中創建單例對象,再將該單例對象通過getInstance()方法返回給外部使用,由Java虛擬機來保證其線程安全性。
優點:延遲載入,既可以保證線程安全,又不影響系統性能。
缺點:與語言本身的特性有關(因為由Java虛擬機來保證其線程安全性),很多面向對象語言不支持IoDH。
二、單例模式應用場景
資料庫連接池,線程池,日誌處理,計數器,sevice和dao通常也是單例的。