單例模式是最簡單的設計模式,但是使用時要注意執行緒安全問題,以下是單例模式的幾種寫法,比較好的方法是基於類初始化的方式,既能實現執行緒安全,又可以實現延遲載入。餓漢模式可實現執行緒安全,但是效率可能會出現問題。還應注意雙重鎖的檢測,由於指令重排並不能保證執行緒安全
一.餓漢式:
public class singleton//必須是private 的,保證使用者不能手動new 乙個例項
public singleton getinstance()
}//執行緒安全,因為static 的變數乙個類只有乙份
二.懶漢式:
1.public class singleton
public static singleton getinstance()
}第一種方法適用於單執行緒,非執行緒安全。 static關鍵字的用法,使用static關鍵字修飾的變數只有在第一次使用的時候才會被初始化,而且乙個類裡面static的成員變數只會有乙份,這樣就保證了無論多少個執行緒同時訪問,所拿到的resource物件都是同乙個。
2.public class singleton
public static synchronized singleton getinstance()
} 第二種方法執行緒安全,但是鎖粒度過大,執行效率低
3.public class singleton()
public static singleton getinstance()
return instance;}}
第三種方法降低了鎖的粒度,採用了雙重鎖檢測的方式,但是由於指令重排的存在,所以非執行緒安全
有資料依賴性的兩個操作不會被重排序,但是當這兩個操作在不同的線城時,資料依賴性不被考慮
4.public class singleton
public static singleton getinstance()
}return instance; }}
第四種方法用volatile來修飾instance,volatile的作用:保證記憶體可見性,防止指令重排
5.public class instancefactory
public static getinstance()
static instance()
}
執行緒安全的單例模式
廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的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...