** 類型:**它是一種創(chuàng)建類模式性置。
在平時(shí)開發(fā)的時(shí)候,無論是自己寫還是看別人的代碼揍堰,可能隨時(shí)都會(huì)看到單例模式鹏浅。可能有的人都寫得不愛了屏歹。但是我還是想根據(jù)我的見解來說說它隐砸。
單例模式就是確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。單例模式寫法有好幾種蝙眶。
- 餓漢式:private static Singleton uniqueInstance = new Singleton();
- 懶漢式: private static Singleton uniqueInstance = null;
Java里面實(shí)現(xiàn)的單例是一個(gè)虛擬機(jī)的范圍季希。因?yàn)檠b載類的功能是虛擬機(jī)的,所以一個(gè)虛擬機(jī)在通過自己的ClassLoader裝載餓漢式實(shí)現(xiàn)單例類的時(shí)候就會(huì)創(chuàng)建一個(gè)類的實(shí)例幽纷。
懶漢式單例有延遲加載和緩存的思想式塌。
懶漢式單例
//懶漢式單例類.在第一次調(diào)用的時(shí)候?qū)嵗约?
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//靜態(tài)工廠方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
餓漢式單例
//餓漢式單例類.在類初始化時(shí),已經(jīng)自行實(shí)例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//靜態(tài)工廠方法
public static Singleton1 getInstance() {
return single;
}
}
餓漢式與懶漢式的區(qū)別
- 懶漢式是典型的時(shí)間換空間友浸,餓漢式是典型的空間換時(shí)間
- 不加同步的懶漢式是線程不安全的峰尝。比如,有兩個(gè)線程收恢,一個(gè)是線程A境析,一個(gè)是線程B,它們同時(shí)調(diào)用getInstance方法派诬,就可能導(dǎo)致并發(fā)問題劳淆。餓漢式是線程安全的,因?yàn)樘摂M機(jī)保證只會(huì)裝載一次默赂,在裝載類的時(shí)候是不會(huì)發(fā)生并發(fā)的沛鸵。
如何保證懶漢式的同步問題
- 1.同步方法
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
但這樣會(huì)降低整個(gè)訪問的速度,而且每次都要判斷缆八∏可以用雙重檢查加鎖。
- 2.雙重檢查加鎖
雙重加鎖機(jī)制奈辰,指的是:并不是每次進(jìn)入getInstance方法都需要同步栏妖,而是先不同步,進(jìn)入方法過后奖恰,先檢查實(shí)例是否存在吊趾,如果不存在才進(jìn)入下面的同步塊宛裕,這是第一重檢查。進(jìn)入同步塊后论泛,再次檢查實(shí)例是否存在揩尸,如果不存在,就在同步的情況下創(chuàng)建一個(gè)實(shí)例屁奏。這是第二重檢查岩榆。
雙重加鎖機(jī)制的實(shí)現(xiàn)會(huì)使用一個(gè)關(guān)鍵字volatile,它的意思是:被volatile修飾的變量的值坟瓢,將不會(huì)被本地線程緩存勇边,所有對(duì)該變量的讀寫都是直接操作共享內(nèi)存,從而確保多個(gè)線程能正確的處理該變量折联。
public class Singleton {
/**
* 對(duì)保存實(shí)例的變量添加volitile的修飾
*/
private volatile static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class) {
instance = new Singleton();
}
}
return instance;
}
}
單元素的枚舉類型實(shí)現(xiàn)單例
根據(jù)《Effective Java第二版》中的說法粒褒,單元素的枚舉類型已經(jīng)成為實(shí)現(xiàn)Singleton的最佳方法。
public enum Singleton {
singleton;
private Singleton () { }
}
如有不妥崭庸,歡迎指出怀浆。哈哈哈哈