一:Lock概念
Lock锁的基础语法是:
private object obj = new object();//创建一个对象
public static void Work()
{
lock(obj)//锁住这个对象
{
//做一些必须按照顺序做的事情
}
}
Lock出现的目的是,在多线程中,使用lock后,能使该代码块按照指定的顺序执行,被lock这块代码已经被其中一个线程访问了,那么另外一个线程只能等待。
二:代码讲解
/// <summary>
/// 锁对象
/// </summary>
private static object obj = new object();
/// <summary>
/// 执行方法
/// </summary>
/// <returns></returns>
[HttpGet()]
public string Get()
{
A();//先调用A方法
B();//再调用B方法
return "value";
}
我在这里定义了一个接口,来分别调用A、B两个方法
1、没加Lock锁情况:
public static void A()
{
Task.Run(() =>
{
for (int i = 1; i <= 25; i++)
{
Console.WriteLine("我是A方法循环第:" + i + "遍");
}
});
Console.WriteLine();
}
public static void B()
{
Task.Run(() =>
{
for (int i = 1; i <= 25; i++)
{
Console.WriteLine("我是B方法循环第:" + i + "遍");
}
});
Console.WriteLine();
}
如上,这是没有加Lock锁的情况,A、B两个方法的内容因为多线程原因,数据已经开始错乱!
2、加上Lock锁情况:
public static void A()
{
lock (obj)
{
Task.Run(() =>
{
for (int i = 1; i <= 25; i++)
{
Console.WriteLine("我是A方法循环第:" + i + "遍");
}
});
}
Console.WriteLine();
}
public static void B()
{
lock (obj)
{
Task.Run(() =>
{
for (int i = 1; i <= 25; i++)
{
Console.WriteLine("我是B方法循环第:" + i + "遍");
}
});
}
Console.WriteLine();
}
如上:加上Lock锁的话,他是按照我们的理想顺序先执行A,再执行B方法!
可能在此,大家看不出来什么异常,但是在我们日常工作中,线程几十个上百个的话,同时访问一个数据库中的某个表,那么大家可想而知会遇到什么麻烦,数据库锁死等等!!
好了今天的分享到这里就结束了,大家有什么更好的技术,欢迎到评论区讨论!!!