在23種設計模式中單利模式算是比較簡單的一種設計模式了,雖然簡單,可是他的實現卻有不少種。下面會給出兩種最佳實現和其餘一些常見的實現方式。設計模式
不須要延遲加載時的最佳實現安全
public enum Singleton {
//每一個元素就是一個單例
INSTANCE;
//業務方法
public void method(){}
}
複製代碼
優勢:bash
缺點:優化
須要延遲加載時的最佳實現ui
public class Singleton {
//1. 建立私有的 靜態內部類
private static class inner {
//1.1 在靜態內部類裏,建立 私有的 靜態的 外部類對象
private static Singleton instance = new Singleton();
}
//2. 私有化構造器,禁止他人建立實例
private Singleton() {
}
//3. 建立 公開的 靜態的 獲取實例的方法
public static Singleton getInstance() {
return inner.instance;
}
}
複製代碼
優勢:spa
缺點:線程
public class Singleton {
//1. 建立私有的 靜態的內部實例
private static Singleton instance = new Singleton();
//2. 私有化構造器,禁止他人建立實例
private Singleton(){}
//3. 建立 公開的 靜態的 獲取實例的方法
public static Singleton getInstance(){
return instance;
}
}
複製代碼
優勢:設計
缺點:code
public class Singleton {
//1. 建立私有的 靜態的內部實例,並初始化爲null
private static Singleton instance = null;
//2. 私有化構造器,禁止他人建立實例
private Singleton() {
}
//3. 建立 公開的 靜態的 獲取實例的方法
public static Singleton getInstance() {
// 先判斷單例是否爲空,以免重複建立
if( instance == null){
instance = new Singleton();
}
return instance;
}
}
複製代碼
優勢:對象
public class Singleton {
//1. 建立私有的 靜態的內部實例,並初始化爲null
private static Singleton instance = null;
//2. 私有化構造器,禁止他人建立實例
private Singleton() {
}
//3. 建立 公開的 靜態的 獲取實例的方法
public static synchronized Singleton getInstance() {
// 加入同步鎖
if (instance == null)
instance = new Singleton();
return instance;
}
}
複製代碼
優勢:
注意:JVM的指令重排序,可能會致使雙重校驗鎖失效
public class Singleton {
//1. 建立私有的 靜態的內部實例,並初始化爲null
private static Singleton instance = null;
//2. 私有化構造器,禁止他人建立實例
private Singleton() {
}
//3. 建立 公開的 靜態的 獲取實例的方法
public static Singleton getInstance() {
// 加入雙重校驗鎖
// 校驗鎖1:第1個if
if( instance == null){
synchronized (Singleton.class){
// 校驗鎖2:第2個 if
if( instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
複製代碼
優勢:
使用 volatile 關鍵字來防止指令重排序
public class Singleton {
//1. 建立私有的 靜態的 可見的 內部實例,並初始化爲null
private static volatile Singleton instance = null;
//2. 私有化構造器,禁止他人建立實例
private Singleton() {
}
//3. 建立 公開的 靜態的 獲取實例的方法
public static Singleton getInstance() {
// 加入雙重校驗鎖
// 校驗鎖1:第1個if
if( instance == null){
synchronized (Singleton.class){
// 校驗鎖2:第2個 if
if( instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
複製代碼
優勢: