关于C#中Queue的线程安全问题
若要保证 Queue 的线程安全,必须通过此包装执行所有操作。
通过集合枚举在本质上不是一个线程安全的过程。甚至在对集合进行同步处理时,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。
下列示例说明如何同步 Queue、如何确定 Queue 是否同步以及如何使用同步的 Queue。
[C#]
using System;
using System.Collections;
public class SamplesQueue {
public static void Main() {
// Creates and initializes a new Queue.
Queue myQ = new Queue();
myQ.Enqueue( "The" );
myQ.Enqueue( "quick" );
myQ.Enqueue( "brown" );
myQ.Enqueue( "fox" );
// Creates a synchronized wrapper around the Queue.
Queue mySyncdQ = Queue.Synchronized( myQ );
// Displays the sychronization status of both Queues.
Console.WriteLine( "myQ is {0}.", myQ.IsSynchronized ? "synchronized" : "not synchronized" );
Console.WriteLine( "mySyncdQ is {0}.", mySyncdQ.IsSynchronized ? "synchronized" : "not synchronized" );
}
}
/*
This code produces the following output.
myQ is not synchronized.
mySyncdQ is synchronized.
*/
通过对比运行结果,可以明显的看出通过Queue.Synchronized方法包装的Queue被同步,没有包装的则没有被同步。可以在实例化处这样声明,
// Creates a synchronized wrapper around the Queue.
Queue mySyncdQ = Queue.Synchronized( new Queue());
这样在多线程环境下可以使用Queue的同步对象锁,来防止多线程同时对Queue进行写操作。如果想让其它线程不能访问Queue对象,则可以使用lock(queue),来达到这个目的。
相关文章
- 辛巴学院-Unity-剑英的c#提高篇(一)主循环
- VUE 前端调用Base64加密,后端c#调用Base64解密
- C# 解决“请求被中止: 未能创建 SSL/TLS 安全通道”的问题
- c# 中内部类的简单介绍 C#内部类
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
- ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
- [C#基础]c#中的BeginInvoke和EndEndInvoke
- Word控件Spire.Doc 【加密解密】教程(一):在 C#、VB.NET 中使用自定义密码加密、解密、保护 Word
- 【C#】yield
- C#【必备技能篇】使用NPOI实现对excel的读取和写入
- C#,动态规划(DP)N皇后问题(N Queen Problem)的回溯(Backtracking)算法与源代码
- C#,入门教程(27)——应用程序(Application)的基础知识
- C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)
- C#跨线程操作控件的线程安全方法
- C# 异步编程
- 《Arduino家居安全系统构建实战》——1.3 我们的第一个模型(C#版本)
- 《敏捷软件开发:原则、模式与实践(C#版.修订版)》—第1章1.4节参考文献
- 基于C#实现简易绘图工具【100010177】
- 基于C#开发的(WinForm)图书管理系统【100010037】
- C# 文件大小字节byte换算为 Kb Mb Gb Tb
- 【C#/WPF】调节图像的对比度(Contrast)
- c#类的定义,c#中的关健字,C#标识符
- C#与.NET Framework c#编程语言,和java是一样的。(c#,java) -->javaweb,asp.net