---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------
Java單例設計模式
一. 定義:
1. 設計一個類,這個類確保只能有一個實例對象,在內存中只存在一個對象,而且向整個系統提供這個對象,成爲單例設計模式。
2.如何保證對象唯一性?
a.將構造方法私有化,這樣外部就不能使用構造方法new對象了。
b.在類中創建一個本類對象,爲了防止外部訪問使用這個對象,必須將構造函數私有化。
c. 提供一個靜態方法讓外部可以通過這個方法獲得到本類這個自定義的對象。
3. 懶漢式和餓漢式
餓漢式(此時的對象是隨着類加載而加載)
單例設計模式,保證對象的唯一性;
兩種方式:1,懶漢式 2,餓漢式
1 class Student{
private Student(){}
prevate Student s=new Student();
pribulic static Student getStudent(){
return s;
}
}
2 class Single{
prevate Single(){}
private static Single getInstance(){
if(s==null)
s=new Single();
return s;
}
}
4.多線程中的安全問題我們發現當一個線程方法時,是沒有任何問題,但是多個線程發生併發訪問就存在問題了。
假如線程1判斷完if(s == null)之後就被CPU切換到另一個線程,線程執行,進來也做完了if(s == null)判斷,
此時線程1得到了CPU的執行權,就去new了一個對象,然後線程2也new了一個新的對象,
所以懶漢式的對象延遲加載導致了多線程併發訪問產生多個不同對象的問題發生。所以既然是考慮到多線程,
當然我們就要用到多線程同步語句去控制併發訪問了。
解決方法:加上同步代碼塊和雙重判斷
class Student{
private Student(){}
private Student s=new Student();
public static Student getStudent(){
if(s==null){
synchronized(student.class){
if(s==null){
s=new Student();
}
}
}
return s;
}
}
5、在實際開發中,建議使用餓漢式,因爲在開發中,要用到單例設計模式的話,對象不管怎麼樣都是要建立的
而且在餓漢式中,沒有線程安全問題,效率要比懶漢式高些
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------