基本概念:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
常見寫法:
懶漢式
package com.ck.gof;
public class Singleton {
/* 持有私有靜態實例,防止被引用,此處賦值為null,目的是實現延遲加載 */
private static Singleton instance = null;
private Singleton() {
}
/* 1:懶漢式,靜態工程方法,創建實例 */
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
調用:
Singleton.getInstance().method();
優點:延遲加載(需要的時候才去加載),適合單線程操作
缺點: 線程不安全,在多線程中很容易出現不同步的情況,如在數據庫對象進行的頻繁讀寫操作時。
雙重線程檢查模式
public class SingletonInner { private static volatile SingletonInner sInst = null; // <<< 這裡添加了 volatile /** * 私有的構造函數 */ private SingletonInner() {} public static SingletonInner getInstance() { SingletonInner inst = sInst; // <<< 在這裡創建臨時變量 if (inst == null) { synchronized (SingletonInner.class) { inst = sInst; if (inst == null) { inst = new SingletonInner(); sInst = inst; } } } return inst; // <<< 注意這裡返回的是臨時變量 } protected void method() { System.out.println("SingletonInner"); } }
調用:
Singleton.getInstance().method();
優點:延遲加載,線程安全
缺點: 寫法複雜,不簡潔
內部類的實現
public class SingletonInner {
/** * 內部類實現單例模式 * 延遲加載,減少內存開銷 */
private static class SingletonHolder {
private static SingletonInner instance = newSingletonInner();
}
/** * 私有的構造函數 */privateSingletonInner() {}
public static SingletonInner getInstance() {
return SingletonHolder.instance;
}
protected void method() {
System.out.println("SingletonInner");
}
}
調用:
Singleton.getInstance().method();
閱讀更多 JAVA開發小助手 的文章