確保類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局的訪問(wèn)點(diǎn)。
創(chuàng)建步驟
- 構(gòu)造函數(shù)私有化
- 類(lèi)持有一個(gè)靜態(tài)實(shí)例instance
- 提供一個(gè)靜態(tài)方法訪問(wèn)單例
一個(gè)私有的構(gòu)造函數(shù)、一個(gè)靜態(tài)變量、一個(gè)靜態(tài)方法
創(chuàng)建方法
-
同步創(chuàng)建
優(yōu)點(diǎn): 簡(jiǎn)單
缺點(diǎn): getInstance()方法只有在第一次創(chuàng)建的時(shí)候才需要同步,在實(shí)例化后就不需要同步了,會(huì)降低程序性能
public class Singleton{ private static Singleton instance; private Singleton{} public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } -
急切實(shí)例化
優(yōu)點(diǎn): 簡(jiǎn)單
缺點(diǎn): JVM在加載類(lèi)時(shí)創(chuàng)建出實(shí)例,造成運(yùn)行負(fù)擔(dān)。
public class Singleton{ private static Singleton instance = new Singleton(); private Singleton{} public static Singleton getInstance(){ return instance; } } -
雙重檢查加鎖
優(yōu)點(diǎn): 延遲實(shí)例化,減少負(fù)擔(dān),同時(shí)減少同步時(shí)間
缺點(diǎn): volatile對(duì)于java 1.4版本不支持
public class Singleton{ private volatile static Singleton instance; // volatile 保證內(nèi)存可見(jiàn) private Singleton{} public static Singleton getInstance(){ if(instance == null){ // 檢查一次 synchronized(Singleton.class){ if(instance == null){ // 再檢查一次 instance = new Singleton(); } } } return instance; } }