我有一個類(單),它包含在這個類我填充字典的實例的靜態字典字典作爲線程安全變量
private static Dictionary<string, RepositoryServiceProvider> repositoryServices = null;
(可以從多個線程發生)。起初我只是
RepositoryServiceProvider service = null;
repositoryServices.TryGetValue(this.Server.Name, out service);
if (service == null) {
service = new RepositoryServiceProvider(this.Server);
repositoryServices.Add(this.Server.Name, service);
}
然後我得到了一些異常的項目已經添加,所以我把它改爲:
RepositoryServiceProvider service = null;
repositoryServices.TryGetValue(this.Server.Name, out service);
if (service == null) {
lock (padlock) {
repositoryServices.TryGetValue(this.Server.Name, out service);
if (service == null) {
service = new RepositoryServiceProvider(this.Server);
repositoryServices.Add(this.Server.Name, service);
}
}
}
和掛鎖是在類:
private static readonly object padlock = new object();
是這樣的線程安全?或其過度複雜?或者我應該使用ConcurentDictionary?
您更改的代碼不是線程安全的:初始'TryGetValue'也需要位於'lock'節中。但是,如果可能的話,您最好使用類似[ConcurrentDictionary'](http://msdn.microsoft.com/zh-cn/library/dd287191.aspx)的內容,如[Yahia的回答]中所述( http://stackoverflow.com/a/9993904/55847) - 它肯定會更安全,更簡單,甚至可能更快。 –
LukeH
2012-04-03 13:13:25
可能的重複http://stackoverflow.com/questions/9868219/dictionary-with-lock-or-concurency-dictionary/9868256#9868256 – daryal 2012-04-03 13:14:23
@LukeH +1回答我的問題謝謝 – Zavael 2012-04-03 14:21:21