C#中的lock
C#中的lock
lock語法為:
private object o = new object();//創建一個對象
public void Work()
{
lock(o)//鎖住這個對象
{
//做一些必須按照順序做的事情
}
}
相當于:
private object o = new object();//創建一個對象
public void Work()
{
Monitor.Enter(o);
//做一些必須按照順序做的事情
Monitor.Exit(0);
}
目的是,在多線程中,使用lock后,能使該代碼塊按照指定的順序執行,被lock這塊代碼已經被其中一個線程訪問了,那么另外一個線程只能等待。
例子:
static int a = 0;
static int b = 0;
static void A()
{
a += 2;
Console.WriteLine($"In A,a={a}");
Thread.Sleep(5000);
b += 2;
Console.WriteLine($"In A,b={b}");
}
static void B()
{
b++;
Console.WriteLine($"In B,b={b}");
Thread.Sleep(1000);
a++;
Console.WriteLine($"In B,a={a}");
}
static void Main()
{
A();
B();
Console.ReadLine();
}
按照單線程,先執行A,然后B,沒有問題。
output:
In A,a=2
In A,b=2
In B,b=3
In B,a=3
改為:
static void Main()
{
Task t1 = new Task(A);
Task t2 = new Task(B);
t1.Start();
t2.Start();
Console.ReadLine();
}
output:
In A,a=2
In B,b=1
In B,a=3
In A,b=3
而我們期望,不論是先執行A還是B,在同一個時間,一個線程執行A或者B,即使用線程鎖lock的時候,不會出現兩個線程搶占執行函數的情況;
static object o=new object();//鎖對象
static int a = 0;
static int b = 0;
static void A()
{
lock (o)//鎖定同一對象,僅允許同一時間,一個線程進行如下操作
{
a += 2;
Console.WriteLine($"In A,a={a}");
Thread.Sleep(5000);
b += 2;
Console.WriteLine($"In A,b={b}");
}
}
static void B()
{
lock (o)//鎖定同一對象,僅允許同一時間,一個線程進行如下操作
{
b++;
Console.WriteLine($"In B,b={b}");
Thread.Sleep(1000);
a++;
Console.WriteLine($"In B,a={a}");
}
}
static void Main()
{
Task t1 = new Task(A);
Task t2 = new Task(B);
t1.Start();
t2.Start();
Console.ReadLine();
}
output:
In B,b=1
In B,a=1
In A,a=3
In A,b=3
output:
In A,a=2
In A,b=2
In B,b=3
In B,a=3
總結
- 上一篇: useEffect的那些坑,你知道多少
- 下一篇: .NET 原生驾驭 AI 新基建实战系列