• 技术文章 >后端开发 >C#.Net教程

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

    Y2JY2J2017-04-17 16:43:19原创1748
    多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。 线程安全问题都是由全局变量及静态变量引起的。

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

    //需要加锁的静态全局变量

     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);
            }
    }

    在时序图中我们可以知道,共有两个线程进行交互,如下图所示:

    173650skktq2s6k9i01kmu.jpg

    php入门到就业线上直播课:进入学习

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

    173651j0z8c0qaqqppbav8.png

    若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时对一个变量执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全

    以上就是分享多线程下C#如何保证线程安全的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:C#,多线程安全
    上一篇:ASP.Net Web 如何使用会话状态详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言中关键字有多少个• 解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误• asp.net 图片验证码的HtmlHelper• ASP.NET使用Ajax如何返回Json对象的方法具体介绍• 应用绝对路径与相对路径
    1/1

    PHP中文网