簡述 類型:創建型。 目的:杜絕相同對象的反覆創建,提升系統性能。 話不多說,直接看實現方案例。 實現案例 餓漢式 項目啟動時載入 public class Test { private static Test ins = new Test(); public static Test instanc ...
簡述
- 類型:創建型。
- 目的:杜絕相同對象的反覆創建,提升系統性能。
話不多說,直接看實現方案例。
實現案例
餓漢式
項目啟動時載入
public class Test {
private static Test ins = new Test();
public static Test instance() {
return ins;
}
}
在項目啟動時就被載入 → 項目啟動變慢
如果對象不經常使用的話還存在浪費資源的問題。
懶漢式
懶載入,在使用時才被載入
public class Test {
private static Test ins;
public static synchronized Test instance() {
if (ins == null) ins = new Test();
return ins;
}
}
在項目啟動時並不載入 → 項目載入變快
第一次使用時載入 → 存在第一次使用時等待過長的問題
使用synchronized方法 → 性能下降
懶漢式(優化版)
懶載入,在使用時才被載入(解決併發的性能問題)
public class Test {
private static Test ins;
public static Test instance() {
if (ins == null) {
synchronized (Test.class) {
if (ins == null) ins = new Test();
}
}
return ins;
}
}
在項目啟動時並不載入 → 項目載入變快
第一次使用時載入 → 存在第一次使用時等待過長的問題
使用雙重判斷方法 → 相對優化前性能提升
不推薦使用
靜態內部類(懶漢式)
懶載入,在使用時才會被載入(無併發性能問題)
public class Test {
private static Singleton {
private static final Test ins = new Test();
}
public static Test instance() {
return Singleton.ins;
}
}
在項目啟動時並不載入 → 項目載入變快
第一次使用時載入 → 存在第一次使用時等待過長的問題
推薦使用
枚舉(餓漢式)
public enum Test {
INSTANCE;
public static Test instance() {
return INSTANCE;
}
}
在項目啟動時就被載入 → 項目啟動變慢
如果對象不經常使用的話還存在浪費資源的問題。
推薦使用
總結
優點
- 減少對象的創建次數,提高系統性能。
缺點
- 由於是靜態資源,所以增加了記憶體上的負擔。
適用場景
-
避免資源的互斥(見樣例)
public class Test { private FileWriter fw; public void write(String fileName, String data) throws IOException { fw = new FileWriter(fileName); fw.write(data); } }
這段代碼可能會有問題:當多個Test對象對同一個fileName寫入時,由於FileWriter的父類Writer中定義的write有一把對象鎖,多個FileWriter就導致有多把鎖,無法做到互斥,就會出現錯誤。
-
全局唯一類(工具類等)
本文來自博客園,作者:buzuweiqi,轉載請註明原文鏈接:https://www.cnblogs.com/buzuweiqi/p/16703313.html