Hashtable.Synchronized(new Hashtable()) 多线程增删问题?

tandizt 2016-12-10 11:06:21
 private static Hashtable _LoanInfoRecommendHs = Hashtable.Synchronized(new Hashtable());

定义一个全局变量_LoanInfoRecommendHs,
那么多线程增删的时候是否需要lock(_LoanInfoRecommendHs);
...全文
144 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2016-12-12
  • 打赏
  • 举报
回复

Hashtable ht = Hashtable.Synchronized(new Hashtable());
            ht.Add("ok", null);

Thread t1 = new Thread(() =>
                    {
                        lock (ht.SyncRoot)
                        {

                            ht.Add(i, i);
                        }
                    });
tandizt 2016-12-10
  • 打赏
  • 举报
回复
那么多个操作如

if (_LoanInfoRecommendHs.ContainsKey("a"))
{
    // 这里_LoanInfoRecommendHs["a"]可能被其他线程删除了。该逻辑不是线程安全的。
    var str = _LoanInfoRecommendHs["a"]
}
//应该是这样
lock(_LoanInfoRecommendHs)
{
if (_LoanInfoRecommendHs.ContainsKey("a"))
{
    var obj = _LoanInfoRecommendHs["a"]; 
//obj do something
}
}

Forty2 2016-12-10
  • 打赏
  • 举报
回复
单个操作不需要再lock。比如:
_LoanInfoRecommendHs.Add("key", "value");  \\ 线程安全
_LoanInfoRecommendHs.Remove("key");       \\ 线程安全
但是,多个操作并不是线程安全的。比如:
if (_LoanInfoRecommendHs.ContainsKey("a"))
{
    // 这里_LoanInfoRecommendHs["a"]可能被其他线程删除了。该逻辑不是线程安全的。
    var str = _LoanInfoRecommendHs["a"].ToString(); 
}
tandizt 2016-12-10
  • 打赏
  • 举报
回复
解答了疑惑,非常感谢。
Forty2 2016-12-10
  • 打赏
  • 举报
回复
题外话,要用_LoanInfoRecommendHs来同步也可以。这是,任何对_LoanInfoRecommendHs的操作,都要在lock(_LoanInfoRecommendHs)的保护下进行。包括单个操作:

// 线程一
lock(_LoanInfoRecommendHs)
{
   if (_LoanInfoRecommendHs.ContainsKey("a"))
  {
      var v = _LoanInfoRecommendHs["a"];
  }
}

// 线程二
lock(_LoanInfoRecommendHs)
{
   _LoanInfoRecommendHs.Remove("a");
}
这种情况,相当于自己做同步。那么Hashtable.Synchronized(...)就多余了。
Forty2 2016-12-10
  • 打赏
  • 举报
回复
引用 2 楼 tandizt 的回复:
那么多个操作如 ...
方向是对的,不过lock的对象错了。 Hashtable内部操作的同步对象不是你实例化的 _LoanInfoRecommendHs。 Hashtable内部操作的同步对象应该是Hashtable的SyncRoot成员(Sync: 同步,Root: 根)。 因此,你可以试试这样来同步: lock(_LoanInfoRecommendHs.SyncRoot) { if (_LoanInfoRecommendHs.ContainsKey("a")) { var obj = _LoanInfoRecommendHs["a"]; //obj do something } }

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧