單例模式是一種常用的設計模式,其定義是單例物件的類只能允許乙個例項存在。下面來看看幾種常見的單例模式的寫法,以及如何保證執行緒安全的實現。
1、餓漢式(執行緒安全)
這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。但是在類裝載的時候就完成例項化,沒有達到懶載入的效果。如果從始至終從未使用過這個例項,則會造成記憶體的浪費。
public class singletonpublic static singleton getinstance()
}
2、懶漢式(執行緒安全)
這種方式效率太低了,每個執行緒在想獲得類的例項的時候,執行getinstance()方法都要進行同步。而其實這個方法只執行一次例項化**就夠了,後面的想獲得該類例項,直接return就行了。也就是我們之前提到的同步的粒度太粗,synchronized 同步**應該是越細越好。
public class singletonpublic static synchronized singleton getinstance()
return singleton;
}}
3、懶漢式(執行緒安全)的細粒度優化(雙重鎖機制)
對上一種模式進行優化,這裡判斷了兩次是否為 null 是因為在併發環境中當執行緒一執行了第乙個判斷的時候是為null,可此刻另外乙個執行緒正好執行完初始化操作,在釋放鎖以後該執行緒並不知道已經初始化,如果此刻進入**塊不進行再次判斷會再初始化一次,這就違背了單例模式的初衷了。
public class singletonpublic 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...