餓漢式
/**
* 單例模式(餓漢式 - 類加載時主動創(chuàng)建實例)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
// 靜態(tài)初始化中創(chuàng)建單例實例乱投,保證線程安全
private static Singleton uniqueInstance = new Singleton();
// 限制用戶寄悯,使用戶無法通過new方法創(chuàng)建對象
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
}
懶漢式
- 線程不安全
/**
* 單例模式(懶漢式 - 檢測到?jīng)]實例時才創(chuàng)建實例)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
private static Singleton uniqueInstance;
// 限制用戶蛾方,使用戶無法通過new方法創(chuàng)建對象
private Singleton(){}
public static Singleton getInstance(){
// 判斷當(dāng)前單例是否已創(chuàng)建,存在就返回抚官,否則就創(chuàng)建后返回
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
- 線程安全
(在對應(yīng)方法內(nèi)使用synchronized關(guān)鍵字即可)
synchronized public static Singleton getInstance(){
// 判斷當(dāng)前單例是否已創(chuàng)建蚂会,存在就返回,否則就創(chuàng)建后返回
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
- 雙重檢查加鎖版
(首先檢查是否實例已經(jīng)創(chuàng)建耗式,如果尚未創(chuàng)建胁住,“才”進行同步。這樣以來刊咳,只有一次同步彪见,這正是我們想要的效果。)
/**
* 單例模式(懶漢式)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
volatile private static Singleton uniqueInstance;
// 限制用戶娱挨,使用戶無法通過new方法創(chuàng)建對象
private Singleton(){}
public static Singleton getInstance(){
// 判斷當(dāng)前單例是否已創(chuàng)建余指,存在就返回,否則就創(chuàng)建后返回
if (uniqueInstance == null){
synchronized (Singleton.class){
if (uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
- 登記式/內(nèi)部靜態(tài)類方式
(靜態(tài)內(nèi)部實現(xiàn)的單例是懶加載的且線程安全跷坝。)
通過顯式調(diào)用 getInstance 方法時酵镜,才會顯式裝載 SingletonHolder 類,從而實例化 instance柴钻,意味著只有第一次使用這個單例的實例的時候才加載淮韭,同時不會有線程安全問題。
/**
* 單例模式(懶漢式 - 登記式/靜態(tài)內(nèi)部類方式)
* Created by Sheldon on 2019/10/26.
* Project Name: alstudy.
* Package Name: test2.
*/
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}