C#lock语句用法(lock到底有什么用?)(转发)
2021/9/28 9:10:47
本文主要是介绍C#lock语句用法(lock到底有什么用?)(转发),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
lock,顾名思义,锁。
lock的用法说起来容易,就是锁定当前正在执行的内容。真正理解却不容易。
于是,我做了下面的测试,对比使用lock和不使用lock的情况,才真正理解了。
在下面的代码中,线程1,2同时调用函数write(),执行函数里面的内容。
使用线程锁lock的时候,不会出现两个线程抢占执行函数的情况;
不使用线程锁lock的时候,出现两个线程锁抢占执行函数的情景。
所以在有很多个线程(Thread 对象)同时运行,要执行同一个操作(调用一个函数)的时候,使用lock把代码锁定,就告诉那很多个线程:本函数的本内容只能在同一时间被一个线程调用!
也就避免了第二个代码里竞争运行的结果。
另外,lock一般出现在while(true)循环里。在有线程要调用的函数里面出现。
使用lock的情况如下:
class Program
{
static Object locker = new object(); //创建锁对象
public static int money = 0; //捐款总额
static void Main(string[] args)
{
Thread th1 = new Thread(write); //第一个线程
Thread th2 = new Thread(write); //第二个线程
th1.Start(); //同时开启,并行进行
th2.Start();
}
private static void write()
{
while (true)
{
lock (locker)
{
money = money + 100;
Console.WriteLine("前面的人正在投币,后面的人请等待...");
Thread.Sleep(3000);
Console.WriteLine("目前共募捐:"+ money+"元\n");
}
}
}
}
输出的结果:非常规整,就像只有一个线程运行的结果一样。
不使用lock的情况(把lock注释掉了):th1和th2竞争占用要执行的同一个资源。
class Program
{
static Object locker = new object(); //创建锁对象
public static int money = 0; //捐款总额
static void Main(string[] args)
{
Thread th1 = new Thread(write); //第一个线程
Thread th2 = new Thread(write); //第二个线程
th1.Start(); //同时开启,并行进行
th2.Start();
}
private static void write()
{
while (true)
{
//lock (locker)
//{
money = money + 100;
Console.WriteLine("前面的人正在投币,后面的人请等待...");
Thread.Sleep(3000);
Console.WriteLine("目前共募捐:"+ money+"元\n");
//}
}
}
}
结果出现两个线程同时抢占函数,同时使用资源的情况。
参考:https://blog.csdn.net/smooth_tailor/article/details/52411359?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
————————————————
版权声明:本文为CSDN博主「JosieBook」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38628970/article/details/104696940
这篇关于C#lock语句用法(lock到底有什么用?)(转发)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#