public class MyConfigurationData
{
public double[] Data1 { get; set; }
public double[] Data2 { get; set; }
}
public class MyClass
{
private static object SyncObject = new object();
private static MyConfigurationData = null;
private static MyClass()
{
lock(SyncObject)
{
//Initialize Configuration Data
//This operation is bit slow as it needs to query the DB to retreive configuration data
}
}
public static MyMethodWhichNeedsConfigurationData()
{
lock(SyncObject)
{
//Multilple threads can call this method
//I lock only to an extent where I attempt to read the configuration data
}
}
}
在我的應用程序只需要一次幾多次創建配置數據,並使用它。換句話說,我寫一次並閱讀很多次。而且,我想確保在寫操作完成之前不應該發生讀取。換句話說,我不想將MyConfigurationData讀爲NULL。有沒有辦法實現一個無鎖定靜態配置數據?
我知道什麼是靜態構造函數是一個AppDomain只能調用一次。但是,當我準備配置數據時,如果有線程試圖讀取這些數據,我將如何確保同步有效?最後,我想提高讀取操作的性能。
我可以實現我的目標在無鎖的方式?
感謝您的解釋。 – Imran
+1。 @Imran,請注意,由於最運行時運行時使用鎖來序列化創建,所以在傳統語義中使用傳統語義(使用巧妙的代碼組織來在代碼中沒有鎖/關鍵部分但最多InterlockedXXXX操作)不需要「無鎖」的靜態對象。 –
@AlexeiLevenkov,我明白了。如果運行時在創建靜態對象期間使用鎖定,我很好。我只關心那些靜態對象的無鎖讀取。 – Imran