多线程下C#如何保证线程安全?

多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是若是你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。若是每次运行结果和单线程运行的结果是同样的,并且其余的变量的值也和预期的是同样的。 线程安全问题都是由全局变量及静态变量引发的。编程

  为了保证多线程状况下,访问静态变量的安全,能够用锁机制来保证,以下所示:安全

复制代码
 1         //须要加锁的静态全局变量  2 private static bool _isOK = false;  3 //lock只能锁定一个引用类型变量  4 private static object _lock = new object();  5 static void MLock()  6  {  7 //多线程  8 new System.Threading.Thread(Done).Start();  9 new System.Threading.Thread(Done).Start(); 10  Console.ReadLine(); 11  } 12 13 static void Done() 14  { 15 //lock只能锁定一个引用类型变量 16 lock (_lock) 17  { 18 if (!_isOK) 19  { 20 Console.WriteLine("OK"); 21 _isOK = true; 22  } 23  } 24 } 
复制代码

  须要注意的是,Lock只能锁住一个引用类型的对象。另外,除了锁机制外,高版本的C#中加入了async和await方法来保证线程安全,以下所示:多线程

复制代码
 1 public static class AsynAndAwait  2  {  3 //step 1  4 private static int count = 0;  5 //用async和await保证多线程下静态变量count安全  6 public async static void M1()  7  {  8 //async and await将多个线程进行串行处理  9 //等到await以后的语句执行完成后 10 //才执行本线程的其余语句 11 //step 2 12 await Task.Run(new Action(M2)); 13 Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId); 14 //step 6 15 count++; 16 //step 7 17 Console.WriteLine("M1 Step is {0}", count); 18  } 19 20 public static void M2() 21  { 22 Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId); 23 //step 3 24 System.Threading.Thread.Sleep(3000); 25 //step 4 26 count++; 27 //step 5 28 Console.WriteLine("M2 Step is {0}", count); 29  } 30 }
复制代码

  在时序图中咱们能够知道,共有两个线程进行交互,以下图所示:async

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

 

  若每一个线程中对全局变量、静态变量只有读操做,而无写操做,通常来讲,这个全局变量是线程安全的;如有多个线程同时对一个变量执行读写操做,通常都须要考虑线程同步,不然就可能影响线程安全。线程

水平有限,望各位园友不吝赐教!若是以为不错,请点击推荐和关注!
出处: http://www.cnblogs.com/isaboy/ 声明:本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。
相关文章
相关标签/搜索