所謂單例設計模式,就是採取一定的方法保證在整個軟體系統中,對某個類智慧型存在乙個物件物件例項,並且該類只提供乙個取得其物件的方法(靜態的)
單例模式的八種設計方式
餓漢式(靜態常量)
餓漢式(靜態**塊)
懶漢式(執行緒不安全)
懶漢式(執行緒安全,同步方法)
懶漢式(執行緒安全,同步**塊)
雙重檢查
靜態內部類
列舉
public
class
test01
}// 餓漢式(靜態變數)
class
singleton
// 2.在本類內部建立對選哪個例項
private
final
static singleton singleton =
newsingleton()
;// 3.對外提供乙個公有的靜態方法,返回例項物件
public
static singleton getinstance()
}
優點:
寫法簡單,在類裝載的時候就進行了例項化,避免了執行緒同步的問題
缺點: 在類裝載的時候完成例項化,類裝載的情況很多,不能保證一定會用到這個物件,可能會造成記憶體的浪費。
總結: 可以使用,但是不是最優方式。
public
class
test
}// 餓漢式(靜態**塊)
class
singleton
// 在靜態**塊中建立單例物件
static
// 2.在本類內部建立對選哪個例項
private
static singleton singleton;
// 3.對外提供乙個公有的靜態方法,返回例項物件
public
static singleton getinstance()
}
優點:
和靜態常量的方式類似,只不過將建立例項化物件的過程放在了靜態**塊中執行,同樣是寫法簡單切避免了執行緒同步的安全。
缺點: 同樣是可能造成記憶體浪費。
總結: 可以使用,但是不是最優方式
public
class
test
}class
singleton
// 建立乙個singleton的屬性,但是不建立例項化物件
private
static singleton singleton;
// 提供乙個靜態的公有方法,在使用該方法時才去建立例項化物件
public
static singleton getinstance()
return singleton;
}}
優點:
實現了懶載入的機制,解決了可能的記憶體浪費。
缺點: 是執行緒不安全的,只能在單執行緒情況下使用。當兩個執行緒同時進行到判斷物件是否建立時,可能會造成建立多個例項化物件。違背了單例模式的設計初衷。
總結: 在實際開發時不可以使用。
public
class
test
}// 懶漢式(執行緒安全的)
class
singleton
private
static singleton singleton;
public
synchronized
static singleton getinstance()
return singleton;
}}
優點:
解決了執行緒同步不安全的問題。
缺點: 但是會降低效能,因為在專案中只需要進行一次例項化即可,如果在返回例項化物件處加鎖,則會使其在每次都進行執行緒不同步,大大消耗了效能。
總結: 可以使用,執行緒是安全的,也可以進行多執行緒訪問,但是效能不好,不推薦。
public
class
test
}// 懶漢式(執行緒不安全)
class
singleton
private
static singleton singleton;
public
static singleton getinstance()
}return singleton;
}}
結論:
這個方式同樣是不能解決執行緒安全的問題,不可以使用。
public
class
test
}// 雙重檢查
class
singleton
private
static singleton singleton;
public
static singleton getinstance()
}}return singleton;
}}
優點:
可以解決多執行緒併發的安全問題。
可以實現懶載入,解決可能出現的記憶體浪費。
同時保證了效率,不會每次都是同步的。
每一次判斷例項化是否建立,之後乙個執行緒對類進行鎖定,之後在判斷物件例項化是否建立,如果第二次判斷時還是沒有建立,則進行例項化建立。
結論: 在實際開發中推薦使用。
前提:
1) 在外部類進行裝載的時候靜態內部類不會進行裝載
2) 靜態內部類裝載的時候是執行緒安全的
public
class
test
}// 靜態內部類 完成單例模式
class
singleton
private
static singleton singleton;
// 乙個靜態內部類,該類中有乙個靜態屬性singleton
private
static
class
singletoninstance
// 提供乙個靜態的公有方法,直接返回靜態內部類中的例項化物件屬性
public
static singleton getinstance()
}
優點:
1)這種方式採用了類裝載的機制來保證初始化例項時只有乙個執行緒。
2)靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getinstance方法, 才會裝載singletoninstance類,從而完成singleton的例項化。
3)類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。
4)避免了執行緒不安全,利用靜態內部類特點實現延遲載入,效率高
總結: 推薦使用.
public
class
test
}enum singleton
}
優點:
這借助jdk1.5中新增的列舉來實現單例模式。不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件。
總結: 推薦使用。
1)例模式保證了系統記憶體中該類只存在乙個物件,節省了系統資源,對於一些需要頻繁建立銷毀的物件,使用單例模式可以提高系統效能
2)當想例項化一乙個單例類的時候,必須要記住使用相應的獲取物件的方法,而不是使用new
3)單例模式使用的場景:需要頻繁的進行建立和銷毀的物件、建立物件時耗時過多或耗費資源過多(即:重量級物件),但又經常用到的物件、工具類物件、頻繁訪問資料庫或檔案的物件(比如資料來源、session工廠 等)
設計模式之 單例設計模式
單例設計模式 單例設計模式概述 單例模式就是要確保類在記憶體中只有乙個物件,該例項必須自動建立,並且對外提供。優點 在系統記憶體中只存在乙個物件,因此可以節約系統資源,對於一些需要頻繁建立和銷毀的物件單例模式無疑可以提高系統的效能。缺點 沒有抽象層,因此擴充套件很難。職責過重,在一定程式上違背了單一...
設計模式之單例設計模式
singleton 保證乙個類只有乙個例項,並提供訪問它的全域性訪問點 類初始化時,立即載入這個物件 沒有延時載入的優勢 載入類時,天然的是執行緒安全的!private static singletondemo1 instance new singletondemo1 private singlet...
設計模式之單例設計模式
目錄 1.到底什麼是設計模式?2.什麼是單例設計模式?3.單列設計模式的兩種實現方式 餓漢式懶漢式 執行緒不安全 4.執行緒安全的寫法 餓漢式懶漢式 執行緒安全 設計模式可以理解為別人成功的故事,通用的套路,前人的經驗,設計模式是一種思想,沒有具體的實現。打乙個比方 世界上只有乙個太陽,乙個月亮,單...