110,534
社区成员
发帖
与我相关
我的任务
分享
private static Hashtable _LoanInfoRecommendHs = Hashtable.Synchronized(new Hashtable());
Hashtable ht = Hashtable.Synchronized(new Hashtable());
ht.Add("ok", null);
Thread t1 = new Thread(() =>
{
lock (ht.SyncRoot)
{
ht.Add(i, i);
}
});
if (_LoanInfoRecommendHs.ContainsKey("a"))
{
// 这里_LoanInfoRecommendHs["a"]可能被其他线程删除了。该逻辑不是线程安全的。
var str = _LoanInfoRecommendHs["a"]
}
//应该是这样
lock(_LoanInfoRecommendHs)
{
if (_LoanInfoRecommendHs.ContainsKey("a"))
{
var obj = _LoanInfoRecommendHs["a"];
//obj do something
}
}
_LoanInfoRecommendHs.Add("key", "value"); \\ 线程安全
_LoanInfoRecommendHs.Remove("key"); \\ 线程安全
但是,多个操作并不是线程安全的。比如:
if (_LoanInfoRecommendHs.ContainsKey("a"))
{
// 这里_LoanInfoRecommendHs["a"]可能被其他线程删除了。该逻辑不是线程安全的。
var str = _LoanInfoRecommendHs["a"].ToString();
}
// 线程一
lock(_LoanInfoRecommendHs)
{
if (_LoanInfoRecommendHs.ContainsKey("a"))
{
var v = _LoanInfoRecommendHs["a"];
}
}
// 线程二
lock(_LoanInfoRecommendHs)
{
_LoanInfoRecommendHs.Remove("a");
}
这种情况,相当于自己做同步。那么Hashtable.Synchronized(...)就多余了。