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)
上一篇 2022年6月21日 上午6:46
下一篇 2022年6月21日 上午7:00


相关推荐

  • JFlow与CCBPM的对比

    JFlow与CCBPM的对比前言为了更好的说明 activiti 与 jflow 的两款工作流引擎的特点与区别 我们按照如下几个方面做一次全面的 客观的对比 首先 activiti 是国外的一款开源的工作流程引擎 在国际上影响比较深远与广泛 解决了 BPM 领域的很多问题 值得我们赞赏 他的 boss 好像是 jbpm 的前身 JFlow 是济南驰骋公司开放的一款工作流程引擎 JFlow 的前身是 CCFl

    2026年3月18日
    2
  • 基于docker搭建OpenClaw汉化版之OpenClawChineseTranslation图文教程

    基于docker搭建OpenClaw汉化版之OpenClawChineseTranslation图文教程

    2026年3月13日
    3
  • 从零开始学 iOS 开发的15条建议「建议收藏」

    从零开始学 iOS 开发的15条建议「建议收藏」作者:清醒疯子利炳根授权本站转载。事情困难是事实,再困难的事还是要每天努力去做是更大的事实。因为我是一路自学过来的,并且公认没什么天赋的前提下,进步得不算太慢,所以有很多打算从零开始的朋友会问我,该怎么学iOS开发。跟粉丝群的朋友交流了一下,决定把之前的《18条建议》修改一下,这里统一回答一次。分三部分:第一部分:态度和电脑1、不要关注别人的学习经历,不要关注别人加薪经历

    2022年5月30日
    36
  • 轻松学,听说你还没有搞懂 Dagger2

    轻松学,听说你还没有搞懂 Dagger2Dagger2 确实比较难学 我想每个开发者学习的时候总是经历了一番痛苦的挣扎过程 于是就有了所谓的从入门到放弃之类的玩笑 当然不排除基础好的同学能够一眼看穿 本文的目的尝试用比较容易理解的角度去解释 Dagger2 这样东西 Dagger2 是有门槛的 这样不同水平能力的开发者去学习这一块的时候 感受到的压力是不一样的 我个人总结了大家在学习 Dagger2 时 为什么感觉难于理

    2026年3月19日
    2
  • 新手避坑!Midjourney、Stable Diffusion、ComfyUI怎么选?本地or云端?一篇讲透

    新手避坑!Midjourney、Stable Diffusion、ComfyUI怎么选?本地or云端?一篇讲透

    2026年3月15日
    3
  • volatile关键字到底有什么作用

    volatile关键字到底有什么作用提示:更多优秀博文请移步博主的GitHub仓库:GitHub学习笔记、Gitee学习笔记volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同…

    2022年5月31日
    35

发表回复

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

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