C# 线程手册 第三章 使用线程 .NET 对同步的支持
2012-01-30 07:24 DanielWise 阅读(3317) 评论(4) 编辑 收藏 举报.NET Framework 提供了很多System.Threading,System.EnterpriseService 和 System.Runtime.Compiler 命名空间中的很多类来帮助程序员开发线程安全代码。下表简要地描述了.NET Framework 中的一些同步类。
MethodImplAttribute 类
正如System.Runtime.CompilerServices 命名空间名字所显式的,这个命名空间中包含影响CLR 运行时行为的属性。MethodImplAttribute是通知CLR某个方法是如何实现的众多属性之一。MethodImplAttribute 构造函数之一以MethodImplOptions作为参数。MethodImplOptions枚举有一个保证在任意时间仅有一个线程访问方法的同步字段名。这类似于我们在之前例子中用的lock 关键字。下面的MI.cs 显示了你可以怎样使用这个属性来同步一个方法:
/************************************* /* Copyright (c) 2012 Daniel Dong * * Author:oDaniel Dong * Blog:o www.cnblogs.com/danielWise * Email:o guofoo@163.com * */ using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Runtime.CompilerServices; namespace MethodImpl { class MI { //This attribute locks the method for use //by one and only one thread at a time. [MethodImpl(MethodImplOptions.Synchronized)] public void doSomeWorkSync() { Console.WriteLine("doSomeWorkSync()" + "--Lock held by Thread " + Thread.CurrentThread.GetHashCode()); //When a thread sleeps, it still holds the lock Thread.Sleep(5000); Console.WriteLine("doSomeWorkSync()" + "--Lock released by Thread " + Thread.CurrentThread.GetHashCode()); } //This is a non synchronized method public void doSomeWorkNoSync() { Console.WriteLine("doSomeWorkNoSync()" + "--Entered Thread is " + Thread.CurrentThread.GetHashCode()); Thread.Sleep(5000); Console.WriteLine("doSomeWorkNoSync()" + "--Leaving Thread is " + Thread.CurrentThread.GetHashCode()); } static void Main(string[] args) { MI m = new MI(); //Delegate for Non-Synchronous operation ThreadStart tsNoSyncDelegate = new ThreadStart(m.doSomeWorkNoSync); //Delegate for Synchronous operation ThreadStart tsSyncDelegate = new ThreadStart(m.doSomeWorkSync); Thread t1 = new Thread(tsNoSyncDelegate); Thread t2 = new Thread(tsNoSyncDelegate); t1.Start(); t2.Start(); Thread t3 = new Thread(tsSyncDelegate); Thread t4 = new Thread(tsSyncDelegate); t3.Start(); t4.Start(); Console.ReadLine(); } } }
输出结果类似以下(不同计算机的输出结果可能非常不同):
在上面代码片段中,MI 类有两个方法:doSomeWorkSync() 和 doSomeWorkNoSync() 。MethodImpl 属性被应用到doSomeWorkSync() 方法上来同步它,而doSomeWorkNoSync() 方法未作改动,仍然可以在同一时间被多个线程访问。在Main() 方法中,线程t1 和 t2 访问非同步访问,线程t3 和 t4访问不同方法。使用Thread.Sleep() 方法来保证当一个线程仍然在方法中时另外一个竞争方法可以进入同一个方法。程序的期待行为时线程t1 和 t2 可以同时进入doSomeWorkNoSync()方法, 而仅允许一个线程(t3或t4)进入doSomeWorkSync()方法。如果t1 和 t2 线程优先级一样,那么线程的执行顺序将会是随机的;.NET Framework 不保证线程执行顺序。
如果你仔细看看输出结果,你将发现线程2(t1)和线程3(t2)在同一时间进入doSomeWorkNoSync() 方法,而一旦线程4(t3)在方法doSomeWorkSync()上获得锁的话,线程5(t4)就不允许进入这个方法直到线程4在这个方法上释放锁。
下一篇介绍.NET 同步策略…
作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
2011-01-30 WCF Membership Provider