page contents

C# 集合 — Hashtable 线程安全

本文讲述了C# 集合 — Hashtable 线程安全!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
attachments-2022-07-rHA7lEAp62cb81342a583.png
本文讲述了C# 集合 — Hashtable 线程安全!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
基础知识重要吗?真的很重要。
就在笔者与同事聊天中突然同事提出一个问题,让笔都有点乱了手脚(有点夸张),题目是这样的:
问:Hashtable 是线程安全的吗?
答:…… (沉默中,Yes Or No?Why?)
 
带着问题我们一步一步的解答:
1、线程安全
     概念: 通俗的讲就是多线程访问时,采用了加锁机制,当一个线程操作临界区时,对临界区进行保护,其他线程等前面线程操作完才能排队操作临界区。这样保障数据一致减少数据污染。
2、求证
     各种资料显示 Hashtable 的 Synchronized 静态方法提供线程安全。那根据资料信息我们找到源代码,找到 Synchronized 是如何提供线程安全的。
     都知道 Hashtable 来自 System.Collections 那我们就从他着手找到 Hashtable 中的静态方法 Synchronized:
     C# 集合 — Hashtable 线程安全
     从源码中可以看出,Synchronized 返回一个 SyncHashtable 实例。我们接着找 SyncHashtable
     SyncHashtable 继承自 Hashtable,之所以实现线程安全操作,因为 SyncHashtable 中就已经增加 lock 、
     C# 集合 — Hashtable 线程安全
3、结论
    到这里至少能证明 Hashtable 在实现静 Synchroinzed 方法时是线程安全的没错吧!
    下面写个实例来说明如何使用 Synchronized 实现并发情况下,既有读线程,又有写线程的线程安全实例:
    
C# 集合 — Hashtable 线程安全C# 集合 — Hashtable 线程安全
 1 private Hashtable _ht = Hashtable.Synchronized(new Hashtable());
 2         static void Main(string[] args)
 3         {
 4             new Program().TestLock();
 5             Console.WriteLine($"主线程:{Thread.CurrentThread.ManagedThreadId}");
 6             Console.ReadKey();
 7         }
 8 
 9         public void TestLock()
10         {
11             Task.Factory.StartNew(obj => SyncMethodA((string)obj), "laowang");
12             Task.Factory.StartNew(obj => SyncMethodB((string)obj), "liupangzi");
13             Thread.Sleep(6000);
14             Console.WriteLine($"输出值:{ _ht[0]}");
15         }
16 
17 
18         private void SyncMethodA(string param)
19         {
20             Console.WriteLine($"方法A线程:{Thread.CurrentThread.ManagedThreadId}");
21             lock (_ht.SyncRoot)
22             {
23                 Thread.Sleep(5000);
24                 _ht[0] = "SyncMethodA";
25                 Console.WriteLine($"A方法输出值:{ _ht[0]}");
26             }
27         }
28 
29         private void SyncMethodB(string param)
30         {
31             Console.WriteLine($"方法B线程:{Thread.CurrentThread.ManagedThreadId}");
32             Console.WriteLine($"B方法输出值:{ _ht[0]}");
33             _ht[0] = "SyncMethodB";
34         }
View Code
 
     为了看到效果,线程A使用了锁,并睡眠 5 秒,后设置 hashtable 值为 SyncMethodA ,线程B先读取 hashtable 中的值,再写入 SyncMethodB 值到 hashtable 中。在写入值这句上会被 hashtable 自动销锁住 ,直到A释放掉 SyncRoot 为止。
     上面代码中我们实现锁 SyncRoot 方式进行测试,结果:
     C# 集合 — Hashtable 线程安全
   如果我们更改锁的对象为 hashtable 实例本身,lock(_ht) ,那么线程B不会在 hashtable="SyncMethodB" 这句话自动锁住。所以输出值是:SyncMethodA
注:以上代码请忽略方法传值 
    

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2022-07-11 09:47
  • 阅读 ( 659 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1482 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章