请选择 进入手机版 | 继续访问电脑版
虚位以待    招租QQ:244594752    尺寸:960x60
终身VIP需技术指导请加(官方QQ :244594752 )
加入我们,终身VIP只需159元,全站下载(老客户请联系我补差价即可升级)
查看: 261|回复: 0

理解C#线程安全

[复制链接]

该用户从未签到

2236

主题

2268

帖子

7798

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7798
发表于 2018-3-29 19:07:20 | 显示全部楼层 |阅读模式
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
//需要加锁的静态全局变量
         private static bool _isOK = false;
         //lock只能锁定一个引用类型变量
         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 (_lock)
             {
                 if (!_isOK)
                 {
                     Console.WriteLine("OK");
                     _isOK = true;
                 }
             }
         }

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


public static class AsynAndAwait
  {
         //step 1
         private static int count = 0;
         //用async和await保证多线程下静态变量count安全
         public async static void M1()
         {
             //async and await将多个线程进行串行处理
             //等到await之后的语句执行完成后
             //才执行本线程的其他语句
             //step 2
             await Task.Run(new Action(M2));
             Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
             //step 6
             count++;
             //step 7
             Console.WriteLine("M1 Step is {0}", count);
         }

         public static void M2()
         {
             Console.WriteLine("Current Thread ID is {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
             //step 3
             System.Threading.Thread.Sleep(3000);
             //step 4
             count++;
             //step 5
             Console.WriteLine("M2 Step is {0}", count);
         }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|妙想源码社区 积分提现

GMT+8, 2018-12-10 19:57 , Processed in 1.079622 second(s), 24 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2020 Comsenz Inc.

快速回复 返回顶部 返回列表
 
FDGDF
客服QQ 妙想科技 244594752
【旺旺】 点击这里给我发消息
【邮箱】
244594752@qq.com
【地址】 湖南省常德市武陵区三姑巷77
【妙想科技】 【9188qhl.com】