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");
//}
writeline函数}
}
}
结果出现两个线程同时抢占函数,同时使⽤资源的情况。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论