大話設計模式筆記(十八) 單例模式

2022-05-02 03:09:09 字數 2440 閱讀 7114

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以建立,並且它可以提供乙個訪問該例項的方法。

*/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...