c#集合类的线程安全
来源:互联网 发布:百度云的域名怎么转发 编辑:程序博客网 时间:2024/05/19 17:22
原文网址:http://www.cnblogs.com/Clingingboy/archive/2010/12/06/1897534.html
即位于System.Collections命名空间下的集合,如Hashtable,ArrayList,Stack,Queue等.其均提供了线程同步的一个实现
集合线程同步的问题
public class Demo8{ ArrayList list = new ArrayList(1000000); public Demo8() { ThreadPool.QueueUserWorkItem(new WaitCallback(Task1)); ThreadPool.QueueUserWorkItem(new WaitCallback(Task2)); } public void Task1(object obj) { for (int i = 0; i < 500000; i++) { list.Add(i); } Console.WriteLine(DateTime.Now); Console.WriteLine("Task1 count {0}", list.Count); } public void Task2(object obj) { for (int i = 0; i < 500000; i++) { list.Add(i); } Console.WriteLine("Task2 count {0}", list.Count); }}
与预期结果不同
调整为线程同步的集合
每种数据类型都包含一个静态的Synchronized方法,如
ArrayList list = ArrayList.Synchronized(new ArrayList(1000000));
调整后的结果
以下为注意点:
- IsSynchronized判断集合是否为线程同步
- 其内部通过给SyncRoot属性加锁进行同步(即Monitor.Enter)
自己控制锁
public class Demo8{ ArrayList list = new ArrayList(1000000); public Demo8() { ThreadPool.QueueUserWorkItem(new WaitCallback(Task1)); ThreadPool.QueueUserWorkItem(new WaitCallback(Task2)); } public void Task1(object obj) { lock (list.SyncRoot) { for (int i = 0; i < 500000; i++) { list.Add(i); } } Console.WriteLine(DateTime.Now); Console.WriteLine("Task1 count {0}", list.Count); } public void Task2(object obj) { lock (list.SyncRoot) { for (int i = 0; i < 500000; i++) { list.Add(i); } } Console.WriteLine("Task2 count {0}", list.Count); }}
这样的结果显然好看点.内部实现是在Add方法中做锁定.效果自然不是很好.
其他集合类也是类似的操作
阅读全文
0 0
- c#集合类的线程安全
- c#集合类的线程安全
- c#集合类的线程安全
- c#集合类的线程安全
- c#集合类的线程安全
- c#集合类的线程安全(整理)
- C# 中的线程安全集合类
- 线程安全的集合类
- 线程安全的集合类
- 线程安全的集合
- 线程安全的集合
- 线程安全集合类
- 集合框架的线程安全类
- java线程安全的集合类
- 线程安全的并发集合类
- 自定义线程安全的集合类
- java集合框架,线程安全的类
- .NET的ConcurrentDictionary,线程安全集合类
- 001_a标签用法全解析
- OpenCV库文件介绍
- Faste RCNN 详解
- MVP模式在Android项目中的使用
- HDU 4336 Card Collector (概率-期望DP)【模板】
- c#集合类的线程安全
- @Transactional 用法
- 对IT行业大数据发展的一种目前认识
- 单点登录原理与简单实现
- 实例分享--语音和自然语言控制智能家居
- java多线程处理业务
- 一个接口有多个实现类,当调用接口中的方法时,如何判定用的是哪个实现类
- Source Insight 快捷键
- PxCook 高效智能的研发设计工具。点击设计稿即可生成前端代码的智能标注切图软件