与单线程相比,多线程编程有一个独特的问题,那就是线程安全性问题. 所谓的线程安全性是指在与您的代码相同的进程中有多个线程在运行禁止跨线程调用安全,并且这些线程可以同时运行此代码. 如果每次运行的结果与单线程运行的结果相同,并且其他变量的值也与预期相同. 线程安全问题是由全局变量和静态变量引起的.
为了确保在多线程情况下访问静态变量的安全性,可以使用锁定机制来保证它的安全性,如下所示:
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只能锁定引用类型的对象. 此外,除了锁定机制之外,还添加了async和await方法以确保更高版本的C#中的线程安全禁止跨线程调用安全,如下所示:
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 }
在时序图中,我们可以知道有两个线程正在交互,如下图所示:
使用异步并等待后,上述代码的执行顺序如下图所示:
如果在每个线程中仅读取全局变量和静态变量,但未写入全局变量,则该全局变量通常是线程安全的;如果多个线程同时对一个变量执行读写操作,通常都需要考虑线程同步,否则可能会影响线程安全.
限量,希望大家赐教!如果感觉良好,请点击“推荐并关注”!
来源:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-156506-1.html
#fx_4walls##fx_4walls##fx_4walls#
对于破坏亚洲地区稳定
确实没办法和美国人来硬的