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

C#多线程锁「建议收藏」c#多线程操作队列

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

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

   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.net/152045.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nginx重启几种方法

    nginx重启几种方法

    2021年10月14日
  • HTML5填充颜色的fillStyle测试

    效果:http://hovertree.com/texiao/html5/canvas/1/代码:123415测试fillStyle-何问起16171819202122何

    2021年12月21日
  • PS磨皮滤镜插件:Portraiture 3 for Mac激活成功教程版永久激活方法

    PS磨皮滤镜插件:Portraiture 3 for Mac激活成功教程版永久激活方法为大家推荐Mac上最好用的一款PS磨皮滤镜Portraiture。PortraiturMac主要用于人像图片润色,它可以在保持皮肤的色泽的情况下对图像中的皮肤、头发、眉毛、睫毛等部位进行平滑的疵点处理,功能强大。现为大家带来磨皮滤镜portraituremac激活成功教程版,软件内附激活成功教程补丁,可以助您成功激活成功教程激活portraiture磨皮滤镜。磨皮插件portraiture怎么安装port…

    2022年7月22日
  • MacOS VSCode快捷键[通俗易懂]

    MacOS VSCode快捷键[通俗易懂]Macos下VSCode快捷键文章转载出处:http://www.cnblogs.com/informatics/全局Command+Shift+P/F1显示命令面板Command+P快速打开Command+Shift+N打开新窗口Command+W关闭窗口基本Command+X剪切(未选中文本的情况下,剪切光标所在行)Command+C复制(未选中文本的情况下,复制光标所在行)Option+Up向上移动行Option+D

    2022年6月4日
  • CLion 2021.5.3激活码(最新序列号破解)

    CLion 2021.5.3激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
  • Java内存管理-掌握虚拟机类加载机制(四)

    勿在流沙筑高台,出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!上一篇介绍了整个JVM运行时的区域,以及简单对比了JDK7和JDK8中JVM运行时区域的一些变化,也顺便总结了哪些区域会发生异常(内存溢出)问题。前一篇的话还是非常重要,请大家务必要多多阅读学习和掌握,因为这些基础的知识点会关联后续的一系列问题内容,如果前面没有先有一定的基础知识储…

    2022年2月28日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号