最近面試,被要求寫多線程並發狀態下的單例模式,隨寫了懶人模式
public class Singleton
{
private Singleton(){}
public static readonly Singleton instance = new Singleton();
}
被問道,如何在多線程並發的狀態下保證單例模式,查了半天對readonly 是如何保證並發狀態的下,多個線程同時調用instance變量而產生單例的原理沒有找到,求大神給講講呗!
你的代碼,的確可以保證單例, 靜態屬性初始化,系統會保證線程安全的
但是你的代碼不是延遲模式,或懶人模式噢
只要任何使用到這個類,無論什麼方法,就會初始化靜態變量,
比如這個類如果還有其他靜態方法,那麼訪問這些方法時,就會建立對象了
延遲創建,肯定要求只訪問這個屬性時才建立對象,所以你必須寫一個靜態方法,在方法裡創建對象
這裡考慮效率,無非就是檢查兩次對象是否建立
if (o == null){
鎖定
if (o==null) o=new ...
釋放
}
return o
對比代碼
if (o==null) o=new
如果兩個線程同時檢查o,當然都是null,然後兩個同時創建對象,等於就創建兩次了
而代碼
鎖定
if(o==null) o=new
釋放
則每次執行都要鎖,效率太低了,