C#中的lock
C#中的lock
lock語法為:
private object o = new object();//創(chuàng)建一個對象
public void Work()
{
lock(o)//鎖住這個對象
{
//做一些必須按照順序做的事情
}
}
相當(dāng)于:
private object o = new object();//創(chuàng)建一個對象
public void Work()
{
Monitor.Enter(o);
//做一些必須按照順序做的事情
Monitor.Exit(0);
}
目的是,在多線程中,使用lock后,能使該代碼塊按照指定的順序執(zhí)行,被lock這塊代碼已經(jīng)被其中一個線程訪問了,那么另外一個線程只能等待。
例子:
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=");
}
static void B()
{
b++;
Console.WriteLine($"In B,b=");
Thread.Sleep(1000);
a++;
Console.WriteLine($"In B,a={a}");
}
static void Main()
{
A();
B();
Console.ReadLine();
}
按照單線程,先執(zhí)行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
而我們期望,不論是先執(zhí)行A還是B,在同一個時間,一個線程執(zhí)行A或者B,即使用線程鎖lock的時候,不會出現(xiàn)兩個線程搶占執(zhí)行函數(shù)的情況;
static object o=new object();//鎖對象
static int a = 0;
static int b = 0;
static void A()
{
lock (o)//鎖定同一對象,僅允許同一時間,一個線程進(jìn)行如下操作
{
a += 2;
Console.WriteLine($"In A,a={a}");
Thread.Sleep(5000);
b += 2;
Console.WriteLine($"In A,b=");
}
}
static void B()
{
lock (o)//鎖定同一對象,僅允許同一時間,一個線程進(jìn)行如下操作
{
b++;
Console.WriteLine($"In 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
總結(jié)
- 上一篇: useEffect的那些坑,你知道多少
- 下一篇: C# 之静态构造器与静态字段初始化器