C#编程,资源加锁Lock避免多线程时同时操作同⼀变量造成数据错误的简单⽤writeline输出数值变量
法。
lock 的⽬的:
不想在⾃⼰使⽤的时候别⼈也使⽤这段代码。体现在多线程情况下,只允许当前线程执⾏该代码区域,其他线程等待直到该线程执⾏结束;这样可以多线程避免同时使⽤某⼀⽅法造成数据混乱。
⼀般定义如下:
private static readonly object obj = new object();
lock(obj)
{
'''代码块
}
⽤法
当我们使⽤线程的时候,效率最⾼的⽅式当然是异步,即各个线程同时运⾏,其间不相互依赖和等待。但当不同的线程都需要访问某个资源的时候,就需要同步机制了。也就是说当对同⼀个资源进⾏读写的时候,我们要使该资源在同⼀时刻只能被⼀个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原⼦性。
lock是C#中最常⽤的同步⽅式,格式为lock(objectA){codeB} 。
lock(objectA){codeB} 看似简单,实际上有三个意思,这对于适当地使⽤它⾄关重要:
objectA被lock了吗?没有则由我来lock,否则⼀直等待,直⾄objectA被释放。
lock以后在执⾏codeB的期间其他线程不能调⽤codeB,也不能使⽤objectA。
执⾏完codeB之后释放objectA,并且codeB可以被其他线程访问。
实例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Lockdemo
{
class Program
{
private static readonly Object LockObj =new object();
static int num =10;
static void Main(string[] args)
{
CreatMT(1);
CreatMT(2);
Console.ReadKey();
}
/// <summary>
/// 创建多线程
/// </summary>
static void CreatMT(int threadNo)
{
new Thread(()=>Dolock(threadNo)).Start();
Thread.Sleep(10);
}
/// <summary>
/// 执⾏加锁
/// </summary>
/// <param name="whichone"></param>
static void Dolock(int whichone)
{
ShowMessage("等待锁资源", whichone);
lock(LockObj)
{
Dosomething(whichone);
}
ShowMessage("释放锁", whichone);
}
/// <summary>
/// 要锁的⽅法
/// </summary>
/// <param name="whichone"></param>
static void Dosomething(int whichone)
{
ShowMessage("进⼊锁并开始操作", whichone);
for(int i =0; i <5; i++)
{
Thread.Sleep(1000);
Console.WriteLine($"第{whichone}个线程执⾏:{--num}");
}
ShowMessage($"{whichone} 操作完成,完成时间为"+ DateTime.Now, whichone);
}
static void ShowMessage(string message, int which)
{
Console.WriteLine(String.Format("第{0}个线程 {1}", which, message));
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论