常見的單例模式寫法
阿新 • • 發佈:2018-11-10
單例模式是面試中最常被問到的地方,那麼如何理解單例模式呢?
單例模式的特點:
1、單例類只能有一個例項。
2、單例類必須自己自己建立自己的唯一例項。
3、單例類必須給所有其他物件提供這一例項。
單例在寫法上又分為懶漢模式(執行緒安全,執行緒不安全)、餓漢模式(天生執行緒安全)、雙重校驗鎖等常見寫法。
但是最後會發現所有的單例模式都是static關鍵字進行修飾的方法,為什麼呢?因為static是所有執行緒共享的區域,具體可以瞭解下JVM記憶體相關知識。
懶漢模式怎麼理解呢?
就是很懶,在每次呼叫的時候才去例項化,也可以理解為:在類載入時不進行初始化。
餓漢模式怎麼理解呢?
就是在類載入時就完成了初始化,所以類載入比較慢,但獲取物件的速度快(已經初始化好了,所以快)。
一:懶漢模式,執行緒不安全
/** * 單例一 懶漢,執行緒不安全 * @author kobe * */ public class SingletonDemo01 { private static SingletonDemo01 instance; private SingletonDemo01() { } public static SingletonDemo01 getInstance(){ if (instance == null) { instance = new SingletonDemo01(); } return instance; } }
二:懶漢模式,執行緒安全(用 synchronized確保安全)
/** * 單例二 懶漢 執行緒安全 * @author kobe * */ public class SingletonDemo02 { private static SingletonDemo02 instance; private SingletonDemo02() { } public static synchronized SingletonDemo02 getInstance() { if(instance == null) { instance = new SingletonDemo02(); } return instance; } }
三:餓漢模式,執行緒天生安全
/**
* 餓漢模式
* @author kobe
*
*/
public class SingletonDemo03 {
private static SingletonDemo03 instance = new SingletonDemo03();
private SingletonDemo03() {
}
public static SingletonDemo03 getInstance() {
return instance;
}
}
四:懶漢模式,執行緒安全 (方式二的變種,需要在JDK1.5以後才能這樣使用)
/**
* 單例四 雙重校驗鎖
* @author kobe
*
*/
public class SingletonDemo04 {
private volatile static SingletonDemo04 instance;
private SingletonDemo04() {
}
public static SingletonDemo04 getInstance() {
if (instance == null) {
synchronized (SingletonDemo04.class) {
if(instance == null) {
instance = new SingletonDemo04();
}
}
}
return instance;
}
}