單例項Singleton設計模式

2021-08-31 06:30:19 字數 1707 閱讀 7543

單例項singleton設計模式

這個設計模式主要目的是想在整個系統中只能出現乙個類的例項。這樣做當然是有必然的,比如你的軟體的全域性配置資訊,或者是乙個factory,或是乙個主控類,等等。你希望這

個類在整個系統中只能出現乙個例項。

singleton的版本1.0

public class singleton

public static singleton getinstance()

return singleton;}}

singleton的特點:

私有(private)的建構函式,表明這個類是不可能形成例項了。這主要是怕這個類會有多個例項。

即然這個類是不可能形成例項,那麼,我們需要乙個靜態的方式讓其形成例項:getinstance()。注意這個方法是在new自己,因為其可以訪問私有的建構函式,所以他是可以保

證實例被建立出來的。

在getinstance()中,先做判斷是否已形成例項,如果已形成則直接返回,否則建立例項。

所形成的例項儲存在自己類中的私有成員中。

我們取例項時,只需要使用singleton.getinstance()就行了。

singleton的版本1.1

上面的這個程式存在比較嚴重的問題,因為是全域性性的例項,所以,在多執行緒情況下,所有的全域性共享的東西都會變得非常的危險,這個也一樣,在多執行緒情況下,如果多個執行緒

同時呼叫getinstance()的話,那麼,可能會有多個程序同時通過 (singleton== null)的條件檢查,於是,多個例項就建立出來,並且很可能造成記憶體洩露問題。

我們需要執行緒互斥或同步

並行執行緒變成序列的乙個乙個去new

public class singleton

public static singleton getinstance()

}return singleton;}}

singleton的版本1.2

public class singleton

public static singleton getinstance()

}return singleton;}}

是的,還是有點小問題,我們本來只是想讓new這個操作並行就可以了,現在,只要是進入getinstance()的執行緒都得同步啊,注意,建立物件的動作只有一次,後面的動作全是讀

取那個成員變數,這些讀取的動作不需要執行緒同步啊。這樣的作法感覺非常極端啊,為了乙個初始化的建立動作,居然讓我們達上了所有的讀操作,嚴重影響後續的效能啊!

singleton的版本1.3

public class singleton

public static singleton getinstance()}}

return singleton;}}

感覺**開始變得有點羅嗦和複雜了,不過,這可能是最不錯的乙個版本了,這個版本又叫「雙重檢查」double-check.下面是說明:

第乙個條件是說,如果例項建立了,那就不需要同步了,直接返回就好了。

不然,我們就開始同步執行緒。

第二個條件是說,如果被同步的執行緒中,有乙個執行緒建立了物件,那麼別的執行緒就不用再建立了。

java設計模式 Singleton單例模式

餓漢模式 package singleton created by anshay on 2017年10月14日 email anshaym 163.com 型別 餓漢模式 public class singleton 2.建立類的唯一例項,使用private static修飾 private不允許外...

Java程式設計 單例(Singleton)設計模式

目錄 餓漢式懶漢式 如果想讓乙個類只能產生乙個物件,那麼這個類就可以寫成singleton。類特點 構造方法私有化 通過static方法返回唯一的類物件 package ch3 class singleton 私有構造方法 static方法取得例項化物件 public static singleto...

JAVA設計模式 SINGLETON單例模式

概念 單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例模式只應在有真正的 單一例項 的需求時才可使用 例子 public class singletona private static singletona s public static singletona geti...