五中單例模式的比較

2021-08-21 17:40:26 字數 1646 閱讀 7857

解法一:只適合單執行緒環境(不好)

package test;

/** * @author xiaoping

* */

public class singleton

public static singleton getinstance()

return instance;}}

註解:singleton的靜態屬性instance中,只有instance為null的時候才建立乙個例項,建構函式私有,確保每次都只建立乙個,避免重複建立。

缺點:只在單執行緒的情況下正常執行,在多執行緒的情況下,就會出問題。例如:當兩個執行緒同時執行到判斷instance是否為空的if語句,並且instance確實沒有建立好時,那麼兩個執行緒都會建立乙個例項。

解法二:多執行緒的情況可以用。(懶漢式,不好)

public class singleton 

public static synchronized singleton getinstance()

return instance;}}

註解:在解法一的基礎上加上了同步鎖,使得在多執行緒的情況下可以用。例如:當兩個執行緒同時想建立例項,由於在乙個時刻只有乙個執行緒能得到同步鎖,當第乙個執行緒加上鎖以後,第二個執行緒只能等待。第乙個執行緒發現例項沒有建立,建立之。第乙個執行緒釋放同步鎖,第二個執行緒才可以加上同步鎖,執行下面的**。由於第乙個執行緒已經建立了例項,所以第二個執行緒不需要建立例項。保證在多執行緒的環境下也只有乙個例項。

缺點:每次通過getinstance方法得到singleton例項的時候都有乙個試圖去獲取同步鎖的過程。而眾所周知,加鎖是很耗時的。能避免則避免。

解法三:加同步鎖時,前後兩次判斷例項是否存在(可行)

public class singleton 

public static singleton getinstance()}}

return instance;}}

註解:只有當instance為null時,需要獲取同步鎖,建立一次例項。當例項被建立,則無需試圖加鎖。

缺點:用雙重if判斷,複雜,容易出錯。

解法四:餓漢式(建議使用)

public class singleton 

public static singleton getinstance()

}

註解:初試化靜態的instance建立一次。如果我們在singleton類裡面寫乙個靜態的方法不需要建立例項,它仍然會早早的建立一次例項。而降低記憶體的使用率。

缺點:沒有lazy loading的效果,從而降低記憶體的使用率。

解法五:靜態內部內。(建議使用)

public class singleton 

private static class singletonholder

public static singleton getinstance()

}

註解:定義乙個私有的內部類,在第一次用這個巢狀類時,會建立乙個例項。而型別為singletonholder的類,只有在singleton.getinstance()中呼叫,由於私有的屬性,他人無法使用singleholder,不呼叫singleton.getinstance()就不會建立例項。

優點:達到了lazy loading的效果,即按需建立例項。

比較官方的單例模式

static mygizmoclass sharedgizmomanager nil mygizmoclass sharedmanager return sharedgizmomanager id allocwithzone nszone zone id copywithzone nszone zo...

Java中的五種單例模式

解法一 只適合單執行緒環境 不好 public class singleton public static singleton getinstance return instance 註解 singleton的靜態屬性instance中,只有instance為null的時候才建立乙個例項,建構函式私...

設計模式(五) 單例模式

單例模式,主要由以下幾個模組組成 私有的靜態物件例項,私有的構造方法 避免外部呼叫new物件,保證只有乙個物件的例項 乙個共有的靜態獲取物件的方法 供外部呼叫 如下 懶漢式單例模式 在需要的時候,也即呼叫共有的靜態獲取物件的方法時才建立物件 package singlepattern public ...