保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以建立,並且它可以提供乙個訪問該例項的方法。
*/public class singleton //構造方法私有,防止外界建立例項
// 獲得本類例項的唯一全域性訪問點
public static singleton getinstance()
return instance;}}
public class test }}
兩個物件是相同的例項
在沒有併發問題的情況下,這種方式也是使用比較多的。但缺點也很明顯,多執行緒下根本沒法用。
/**
* created by callmedevil on 2019/8/17.
*/public class singletononlock
public static singletononlock getinstance()
}return instance;}}
當存在物件例項時,完全不用擔心併發時導致堆中建立多個例項,但每次呼叫getinstance()方法時都被加鎖,是會影響效能的,因此這個類可以繼續改良。
/**
* created by callmedevil on 2019/8/17.
*/public class singletonondoublechecklock
public static singletonondoublechecklock getinstance()}}
return instance;}}
當例項存在時,就直接返回,這是沒有問題的。當例項為空並且有兩個執行緒呼叫getinstance()方法時,它們都可以通過第一重instace == null的判斷,然後由於synchronized機制,只有乙個執行緒可以進入,另乙個阻塞,必須要在同步**塊中的執行緒出來後,另乙個執行緒才會進入。而此時如果沒有第二重的判斷,那第二個執行緒仍然會建立例項,這就達不到單例的目的了。
但這種方式是最讓人「詬病」的一種不推薦方式,技巧看上去很好,但實際上同樣影響效能。
/**
* 該類宣告為final ,阻止派生,因為派生可能會增加例項
* created by callmedevil on 2019/8/17.
*/public final class singletonstatic
public static singletonstatic getinstance()
}
jvm第一次載入類的時候就已經建立好了例項,如果接下來的很長時間都沒有用到的話,占用的記憶體相當於被浪費了,也不是最讓人推薦的一種方式。當然現在的伺服器容量也越來越大,單單乙個例項的記憶體也並不是任何情況都要考慮節省。除非追求極致。。
/**
* created by callmedevil on 2019/8/17.
*/public class singletonstaticclass
public singletonstaticclass getinstande()
// 靜態內部類,沒有併發問題
private static final class interclass
}
jvm第一次載入外部的singletonstaticclass時,並不會直接例項化,所以這種方式也屬於「懶漢式」。只有在第一次呼叫getinstance()方法時,jvm才會載入內部類interclass,接著才例項化靜態變數,也就是我們需要的外部類的單例。這樣不僅延時了例項化,同時也解決了併發訪問的問題,因此該方式是最為推薦的一種方式。 《大話設計模式》 筆記 單例模式
單例模式 保證乙個類僅有乙個例項,並提供乙個供訪問的全域性點。其它優點 單例模式因為是卦裝的它的唯一例項,這樣它可以嚴格地控制客戶怎樣訪問它以及何時訪問它。簡單的說就是對唯一例項的受控訪問。呼叫 以上方式存在不足。在多執行緒的程式中,多個執行緒同時訪問單例類,呼叫getinstance 方法,會有可...
大話設計模式 單例模式
在開發過程中,其實很多情況下,都需要用到單例模式來維持物件的唯一性。比如執行緒池 資料來源 sessionfactory等。一般的做法 懶漢式 public class myclass 宣告乙個靜態方法來返或乙個單例物件 public static myclass getinstance 但是這個會...
大話設計模式 單例模式
一 單例模式 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。二 例項 public class singleton public static singleton getinstance return singleton public class singletondousync publ...