使用單例需要注意的關鍵點
- 將建構式訪問修飾符設定為private
- 通過一個靜態方法或者列舉回傳單例類物件
- 確保單例類的物件有且只有一個,特別是在多執行緒環境下
- 確保單例類物件在反序列化時不會重新構建物件
單例模式的幾種寫法
- 餓漢式(靜態常量)
class Singleton{
//1.構造器私有化,外部不能new
private Singleton(){
}
//2.本類內部創建物件實體
private final static Singleton instance = new Singleton();
//3.提供一個公有的靜態方法,回傳實體物件
public static Singleton getInstance(){
return instance;
}
}
- 餓漢式(靜態代碼塊)
class Singleton {
//1.構造器私有化,外部不能new
private Singleton() {
}
//2.本類內部創建物件實體
private static Singleton instance;
static { //在靜態代碼塊中,創建單例物件
instance = new Singleton();
}
//3.提供一個公有的靜態方法,回傳實體物件
public static Singleton getInstance() {
return instance;
}
}
- 懶漢式(執行緒不安全)
class Singleton {
private static Singleton instance;
private Singleton() {
}
//提供一個靜態的公有方法,當使用到方法時,才去創建instance
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 懶漢式(執行緒安全,同步方法)
class Singleton {
private static Singleton instance;
private Singleton() {
}
//提供一個靜態的公有方法,加入同步處理的代碼,解決執行緒安全問題
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 懶漢式(雙重校驗,執行緒安全,效率較高,推薦使用)
class Singleton {
private static volatile Singleton instance; //volatile保證執行緒間的可見性
private Singleton() {
}
//提供一個靜態的公有方法,加入雙重檢查代碼,解決執行緒安全問題,同時解決懶加載問題
//同時保證了效率,推薦使用
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 靜態內部類完成,推薦使用
class Singleton {
private Singleton() {
}
//寫一個靜態內部類,該類中有一個靜態屬性Singleton
//在呼叫getInstance()方法時,靜態內部類才會被裝載,保證了懶加載;同時類加載是執行緒安全的
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
//提供一個靜態的公有方法,直接回傳SingletonInstance.INSTANCE
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
- 使用列舉,推薦使用
enum Singleton{
INSTANCE; //屬性
public void doSomething(){
System.out.println("do something");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274167.html
標籤:其他
上一篇:基于量子密鑰的經典身份認證系統
下一篇:SQL注入繞過WAF兩道題目
