本文摘自PHP中文网,作者Y2J,侵删。
多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。
线程安全问题都是由全局变量及静态变量引起的。 为了保证多线程情况下,访问静态变量的安全,可以用锁机制来保证,如下所示:
//需要加锁的静态全局变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | private static bool _isOK = false ;
private static object _lock = new object ();
static void MLock()
{
new System.Threading.Thread(Done).Start();
new System.Threading.Thread(Done).Start();
Console.ReadLine();
}
static void Done()
{
lock (_lock)
{
if (!_isOK)
{
Console.WriteLine( "OK" );
_isOK = true ;
}
}
}
|
需要注意的是,Lock只能锁住一个引用类型的对象。另外,除了锁机制外,高版本的C#中加入了async和await方法来保证线程安全,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public static class AsynAndAwait
{
private static int count = 0;
public async static void M1()
{
await Task.Run( new Action(M2));
Console.WriteLine( "Current Thread ID is {0}" , System.Threading.Thread.CurrentThread.ManagedThreadId);
count++;
Console.WriteLine( "M1 Step is {0}" , count);
}
public static void M2()
{
Console.WriteLine( "Current Thread ID is {0}" , System.Threading.Thread.CurrentThread.ManagedThreadId);
System.Threading.Thread.Sleep(3000);
count++;
Console.WriteLine( "M2 Step is {0}" , count);
}
}
|
在时序图中我们可以知道,共有两个线程进行交互,如下图所示:

用async和await后,上述代码的执行顺序为下图所示:

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全
以上就是分享多线程下C#如何保证线程安全的详细内容!
相关阅读 >>
使用C#操作windowad之添加对象到用户组
C#开发实例-订制屏幕截图工具(一)功能概览(图)
C# 读取u盘序列号进行验证的示例代码
详细介绍C#实现的md5加密功能与用法示例
详细介绍C#消息提示框messagebox的使用
基础学习之C#的封装
C#生成一万以内所有不重复数字的四位数
C#如何使用?C#的基本语法
C# web应用调试开启外部访问的步骤
C#中@用法的实例解析
更多相关阅读请进入《C#》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » 分享多线程下C#如何保证线程安全