前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#多线程锁「建议收藏」

C#多线程锁「建议收藏」

作者头像
全栈程序员站长
发布2022-08-31 16:34:01
5520
发布2022-08-31 16:34:01
举报

大家好,又见面了,我是你们的朋友全栈君。

C#开发中会常遇到多线程的问题,当多个线程同时对同一个资源进行操作时,就需要注意线程同步的问题。线程如果不同步,可能会造成与预计不同的结果,这时就要对资源进行上锁。当多个线程操作一个全局变量时,如果对全局变量进行上锁,则当一个线程访问这个全局变量时,另一个线程并不能去访问这个全局变量,只有等解锁资源后,其余线程才有机会去访问。这就保证了线程同步。下面是示例: 两个线程fun1和fun2同时对队列进行入队操作,当入队数量比较小时,可能没有问题,当数量较大时,会发现队列中元素个数并不是两个线程入队元素的和。

代码语言:javascript
复制
   public class student
        {
            public int age;
            public string name;
            public int num;
        }
        Queue<student> q= new Queue<student>();

        public void fun1()
        {         
            Monitor.Enter(this);//锁定,保持同步
            student s = new student();
            for (int i = 0; i < 2000000; i++)
            {
                s.num = 1;
                s.age = i;
                s.name = "A" + i.ToString();
                q.Enqueue(s);
            }
            Monitor.Exit(this);//取消锁定

        }

        public void test_queue_nolock()
        {
            Thread t1= new Thread(new ThreadStart(fun1));
            t1.Name="线程1";
            t1.Start();
            Thread t2 = new Thread(new ThreadStart(fun1));
            t2.Name = "线程2";
            t2.Start();       
        }

        private void btn_test_Click(object sender, EventArgs e)
        {
            test_queue_nolock();
            timer_dequeue.Enabled = true;
        }


        private void timer_queue_Tick(object sender, EventArgs e)
        {
            Console.WriteLine("队列写入了{0}条数据", q.Count);
        }

其中线程的启动为: 1)不带参数的启动:Thread t1= new Thread(new ThreadStart(fun1)); 然后再 t1.start()开启该线程 2)带参数的启动方法,就要使用ParameterizedThreadStart委托来实例化Thread了,和ThreadStart一样的是它也是线程启动时要执行的方法,和ThreadStart不同的是,它在实例化时可以用一个带有一个Object参数的方法作为构造函数的参数,而实例化ThreadStart时所用到的方法是没有参数的。ParameterizedThreadStart定义为: public delegate void ParameterizedThreadStart(object obj); Thread t1= new Thread(new ThreadStart(fun1)); t1.start(100);此时的fun1应该有一个object 参数 具体可参考:http://blog.csdn.net/zhoufoxcn/article/details/4402999

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152045.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档