餓漢模式,即認為單例物件在單例所在的類初始化時即例項化了。
因此無論該單例物件是否真正的被呼叫,都會進行例項化。
例項化的操作放在靜態變數或者靜態**塊中。
public class hungrysingleton ;
private final static hungrysingleton hungrysingleton = new hungrysingleton();
public static hungrysingleton getinstance();
}
懶漢模式,單例物件在呼叫的時候,判斷該單例物件是否為空,若空才進行例項化。
public class lazysingleton ;
private static lazysingleton lazysingleton = null;
public static lazysingleton getinstance()
return lazysingleton.lazysingleton;
}}
懶漢模式有執行緒安全問題。如果多個執行緒同時試圖獲取單例,且單例為空,那麼可能會同時建立例項,即發生了多次的建立。
執行緒安全的懶漢模式:
public class safelazysingleton ;
private static safelazysingleton safelazysingleton = null;
public synchronized static safelazysingleton getinstance()
return safelazysingleton.safelazysingleton;
};}
有一種更優雅的方式可以解決執行緒安全問題。由於靜態內部類才不發生呼叫時也不會進行初始化,故可以用來靜態內部類的靜態變數來儲存例項。
public class innerclasslazysingleton ;
private static class innerclasslazysingletoninstance
public innerclasslazysingleton getinstance()
}
多提一句,有看到資料提到使用列舉類也是一種不錯的方法。jvm載入列舉類時使用classloader方法,該方法使用同步**塊保證執行緒安全。
public enum enumsingleton
單例模式學習筆記
單例 優點1.減少記憶體開支 2.減少效能開銷 3.寫檔案時避免資源多重占用 4.優化共享資源訪問 缺點1.自行例項化的特點導致無法擴充套件,只能修改原始碼 2.對測試不利,只有全部完成單例 才能測試 3.與單一職責原則有衝突 適用1.生成唯一序列號的環境 2.整個專案需要乙個共享訪問點 3.建立物...
單例模式學習筆記
public class student 自己造乙個 靜態方法只能訪問靜態成員變數,加靜態 為了不讓外界直接訪問修改這個值,加private private static student s new student 提供公共的訪問方式 為了保證外界能夠直接使用該方法,加靜態 public stati...
單例模式學習筆記
靜態內部類單例 反射破壞單例 序列化破壞單例 註冊式單例 threadlocal 執行緒單例 單例模式 singleton pattern 是指確保乙個類在任何情況下都絕對只有乙個例項 public class hungrysingleton public static hungrysingleto...