執行緒安全的單例模式

2022-02-06 08:46:57 字數 1573 閱讀 3035

單例模式是一種常用的設計模式,其定義是單例物件的類只能允許乙個例項存在。下面來看看幾種常見的單例模式的寫法,以及如何保證執行緒安全的實現。

1、餓漢式(執行緒安全)

這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。但是在類裝載的時候就完成例項化,沒有達到懶載入的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。

public class singleton 

public static singleton getinstance()

}

2、懶漢式(執行緒安全)

這種方式效率太低了,每個執行緒在想獲得類的例項的時候,執行getinstance()方法都要進行同步。而其實這個方法只執行一次例項化**就夠了,後面的想獲得該類例項,直接return就行了。也就是我們之前提到的同步的粒度太粗,synchronized 同步**應該是越細越好。

public class singleton 

public static synchronized singleton getinstance()

return singleton;

}}

3、懶漢式(執行緒安全)的細粒度優化(雙重鎖機制)

對上一種模式進行優化,這裡判斷了兩次是否為 null 是因為在併發環境中當執行緒一執行了第乙個判斷的時候是為null,可此刻另外乙個執行緒正好執行完初始化操作,在釋放鎖以後該執行緒並不知道已經初始化,如果此刻進入**塊不進行再次判斷會再初始化一次,這就違背了單例模式的初衷了。

public class singleton    

public static singleton getinstance()

}return instance;

}}

4、靜態內部類(懶載入,執行緒安全)

這種方式跟餓漢式方式採用的機制類似,但又有不同。兩者都是採用了類裝載的機制來保證初始化例項時只有乙個執行緒。不同的地方在餓漢式方式是只要singleton類被裝載就會例項化,沒有懶載入的作用,而靜態內部類方式在singleton類被裝載時並不會立即例項化,而是在需要例項化時,呼叫getinstance方法,才會裝載singletoninstance類,從而完成singleton的例項化。類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。避免了執行緒不安全,延遲載入,效率高。

public class singleton 

//內部類在外部類呼叫的時候才會被初始化

// 內部類一定要在方法呼叫之前初始化

private static class singletoninstance

// static 使單例空間共享

// final使得方法不能被重寫過載

public static final singleton getinstance()

}

這裡可以在私有的構造方法中進行乙個雙重鎖的判斷,定義乙個 flag來判斷該構造是否被重複呼叫,來防止反射的侵入。

除此之外還可以使用列舉類的方式來實現單例模式。由於實際工作中並未發現有人這麼做,這裡就不演示了。

執行緒安全的單例模式

廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...

執行緒安全的單例模式

單例模式是為了保證乙個類只有乙個例項而且易於外界訪問。所以一般只有把建構函式,拷貝函式,析構函式,賦值函式,變數名變為私有。再用乙個get函式訪問提供介面即可。考慮執行緒安全就要加鎖。一 懶漢模式 1 靜態成員例項的懶漢模式 class singleton public static singlet...

執行緒安全的單例模式

在我們專案中,很多時候需要程式只存在乙個唯一例項。通常在專案中我會把單例模式寫成如下形式 public class singleton public static singleton getinstance return msingleton 通常以這種形式返回乙個類的唯一例項,然而在android...