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


相关推荐

  • MySQL安装(详细,适合小白)

    MySQL安装(详细,适合小白)MySQL安装一、mysql安装包下载二、配置my.ini文件三、初始化MySQL四、可能遇到的错误操作一、mysql安装包下载官网下载地址:mysql安装包下载如图所示:二、配置my.ini文件解压后的文件尽量不要放在C盘(内存小),解压后如下图所示在上图所示梗目录下配置my.ini文件[mysqld]#设置3306端口port=3306[mysqld]#设置3306端口port=3306#设置mysql的安装目录(存放地址可以更改)basedir=E:\My

    2022年6月6日
    41
  • android之OnTouchListener只能监听到ACTION_DOWN—–onTouchListener的返回值问题「建议收藏」

    做这样一个效果,界面上显示一个紫色方块,任意拖动方块到指定位置都可以,结果方块不动,打印log只有ACTION_DOWN有反应,MOVE和UP都监听不到,很是奇怪,先把整段代码都贴下面了package jason.com.security.ui;import jason.com.security.R;import android.app.Activity;import

    2022年3月11日
    40
  • 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程…

    正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程…当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一:强制重新启动电脑(长按电源键然后再按一下),然后会有好多项选择,第一项一般是“正常启动”最后一项是“最后一次正确配置”,选择“最后一次正确配置”(有的电脑可能提…

    2022年6月14日
    110
  • 风控模型开发全流程

    风控模型开发全流程本篇我们对开发金融风控模型做一个总结,先给出流程图:建立模型,当然需要数据,金融风控的数据一般来源于内部与外部,内部是在公司业务系统内已有的,外部主要靠采购三方数据扩展。三方数据的采集标…

    2022年5月7日
    55
  • 5G物理信道和物理信号定义

    5G物理信道和物理信号定义一、上行链路物理信道包含以下信道:1、物理上行链路共享信道PUSCH2、物理上行控制共享信道PUCCH3、物理随机接入信道PRACH其中PUSCH支持的调制方案有:pai/2-BPSKQPSK16QAM64QAM256QAM物理上行链路控制信道支持多种格式:fomat0OFDM符号长度1-2fomat1OFDM符号长度4-14fomat2OFDM符号…

    2022年5月12日
    52
  • js向数组指定位置添加元素[通俗易懂]

    js向数组指定位置添加元素[通俗易懂]一、JavaScriptsplice()方法splice()方法向/从数组中添加/删除项目,然后返回被删除的项目。方法实例//在数组指定位置插入varfruits=[“Banana”,”Orange”,”Apple”,”Mango”];fruits.splice(2,0,”Lemon”,”Kiwi”);//输出结果//Banana,Orange…

    2022年8月10日
    35

发表回复

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

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