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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用计算机算组合数_计算组合数

    用计算机算组合数_计算组合数计算组合数最大的困难在于数据的溢出,对于大于150的整数n求阶乘很容易超出double类型的范围,那么当C(n,m)中的n=200时,直接用组合公式计算基本就无望了。另外一个难点就是效率。对于第一个

    2022年8月6日
    3
  • 使用arpspoof进行ARP欺骗[通俗易懂]

    使用arpspoof进行ARP欺骗[通俗易懂]使用arpspoof进行ARP欺骗使用虚拟机上的kail进行测试基本原理我们将运行实际的ARP中毒攻击,重定向数据包流并使其流经我们的设备基本命令arpspooef-i网卡-t目标ip默认网关测试下面是我作为被攻击的kail,ip为192.168.25.129下面是我作为攻击的kail,网卡对应ip,网卡名字为eth0,ip为192.168.25.128使用上面…

    2022年10月7日
    0
  • matlab函数plot函数_动态变量

    matlab函数plot函数_动态变量引子对于真实系统或者仿真平台,数据是增量式的产生的。Matlab除了强大的矩阵运算外,还具有强大的数据可视化库。由于静态画图的方法较多,本文只针对增量式数据流的动态显示。本文主要介绍几种Matlab实现数据的动态显示方法。方法主要有两种:holdonset函数与drawnow函数组合holdon方法1.方法介绍此种方法比较原始,适合于即时数据,原理是先画上一帧,接着保留原始图像,

    2022年10月10日
    0
  • 银行ATM活动图文档

    银行ATM活动图文档银行ATM问题陈述、词汇表、领域类图链接:http://blog.csdn.net/yingyingbaibai/article/details/70216506银行ATM用况图文档链接:http://blog.csdn.net/yingyingbaibai/article/details/70216792银行ATM分析类类图文档链接:http://blog.csdn.

    2022年5月24日
    25
  • 数据库课程设计——火车票售票系统「建议收藏」

    数据库课程设计——火车票售票系统「建议收藏」火车票预售系统,为购票用户与卖票管理人员之间搭建平台。让用户能够通过该软件对管理人员发布的车次班进行预购与查询,方便旅客的出行。

    2022年5月19日
    176
  • pycharm虚拟环境与本地环境区别_pycharm自带python吗

    pycharm虚拟环境与本地环境区别_pycharm自带python吗    Python的版本众多,在加上适用不同版本的PythonPackage。这导致在同时进行几个项目时,对库的依赖存在很大的问题。这个时候就牵涉到对Python以及依赖库的版本管理,方便进行开发,virtualenv就是用来解决这个问题的。下面介绍使用PyCharm创建VirtualEnvironment的方法。    PyCharm可以使用virtualenv中的功能来创建虚拟环境。Py…

    2022年8月27日
    2

发表回复

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

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