博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lock与C#多线程
阅读量:4563 次
发布时间:2019-06-08

本文共 2282 字,大约阅读时间需要 7 分钟。

lock与C#多线程

  lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。简单讲就类似于 你去银行办理业务,一个柜台一次只能操作以为客户,而如果你要到这个柜台办理业务就必须等前面的人的业务完成,而彼此之间不会有交集。下面通过具体的代码来深入说明:

using System;using System.Threading;namespace LockTest{    class Program    {        static void Main()        {            Test test = new Test();            Thread one = new Thread(test.ThreadOne);    //线程一调用test的 ThreadOne 方法            Thread two = new Thread(test.ThreadTwo);    //线程而调用test的 ThreadTwo 方法            one.Start();    //启动线程一            two.Start();    //启动线程二            Console.ReadKey();        }    }    class LockTest    {        public int Number { get; set; } = 10;        public void Print()        {            Console.WriteLine("The number is " + Number);        }    }    class Test    {        private readonly LockTest _lockTest = new LockTest();   //用于测试的对象        public void ThreadOne()        {            //在此方法内锁定 _lockTest 所引用的对象并执行相应操作,在操作执行完以前不会释放次对象            lock (_lockTest)            {                Console.WriteLine("The object has been locked!");                Thread.Sleep(5000);     //让当前线程休眠 5s                _lockTest.Number = 200;                Console.Write("ThreadOne: ");                _lockTest.Print();            }            //操作完成并释放对象            Console.WriteLine("The object has been released!");        }        public void ThreadTwo()        {
       //Console.WriteLine(_lockTest.Number); _lockTest.Number = 100;        //Console.WriteLine(_lockTest.Number); //锁定 _lockTest 所引用的对象 //如果要保证 lock 正常工作,所有对 _lockTest 的操作都要使用 lock 锁定 //比如上面 _lockTest.Number=100; 在 lock 外面,那么它将不受约束(即可以强制访问 _lockTest) //如果在上面语句后加 Console.WriteLine(_lockTest.Number); 那么将输出 100 而不是 200 (也不是 10) lock (_lockTest) {
          //_lockTest.Number=100; Console.Write("ThreadTwo: "); _lockTest.Print(); } } }}

运行上面的代码会发现在ThreadTwo 方法里的 lock内的代码 时有明显的延迟,即必须等到ThreadOne运行完成了才继续执行 lock内部的代码,而且输出的结果是200而不是100,说明 lock 外面的代码不会发生任何延迟。如果把 _lockTest.Number=100; 语句放在lock内部,会发现结果变成了 100 。

通过上面的例子可以看出要保证 lock 正确工作,要对每个 _lockTest 的操作加上 lock锁定 。而在程序运行的时候,会根据线程访问次对象的先后顺序来为每个线程排序,且只有排在前面的线程对对象的操作完成了后面的对象才能访问此对象。

转载于:https://www.cnblogs.com/SilentCode/p/5135455.html

你可能感兴趣的文章
【计算机视觉】双目测距(五)--匹配算法对比
查看>>
KMP模板
查看>>
luogu 1314 聪明的质检员
查看>>
[转载]求职者防骗必读!楼主亲身经历告诉你岗前培训多么不靠谱而且违法!
查看>>
Hibernate内存溢出分析一例
查看>>
基于Axis1.4的webservice接口开发(接口调用)
查看>>
Hive内置函数详解
查看>>
【转】MyEclipse快捷键大全
查看>>
IT职业技能图谱10--Hadoop家族技能图谱
查看>>
Java - 反射(1)
查看>>
控制台中显示执行的Sql语句
查看>>
Linux(Centos7)下搭建SVN服务器
查看>>
安卓开发的Tasks and Back Stack
查看>>
Ansi,UTF8,Unicode编码
查看>>
原子变量的性能问题
查看>>
Sybase PowerDesigner 15.0 完美版+特别文件
查看>>
快速傅立叶之二
查看>>
cetos 6.3 安装 apache+mysql+php
查看>>
js编写简单的贪吃蛇游戏
查看>>
2018/12/01 一个64位操作系统的实现 第四章 导入kernel.bin(4)
查看>>