多線程中一些線程互斥的操作,比如需要獨佔資源時,需要關起門來一個人玩,這時就需要一個鎖,等這個線程玩完了,鎖就開了,剩下的線程誰先搶到鎖誰玩。
下面的例子是取貨,其它的用例比如多線程通訊中要獨佔端口。
using System;
using System.Threading;
namespace ThreadingDemo
{
class Program
{
int done = 10;
static readonly object locker = new object();
static void Main(string[] args)
{
Program p = new Program();
Random rd = new Random();
Thread a = new Thread(new ThreadStart(delegate { p.Go("~~子線程", rd.Next(1, 10)); }));
a.Start();
p.Go("主線程~~",rd.Next(1, 10));
Console.WriteLine("主線程結束了!!!");
if (a.IsAlive)
Console.WriteLine("子線程還沒結束!!!");
else
Console.WriteLine("子線程結束了!!!");
Console.ReadKey();
}
void Go(string m , int n)
{
//取消lock的註釋看效果
// lock (locker)
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(m + "正在取貨");
}
if (done >= n)
{
done = done - n;
Console.WriteLine(m + "取到貨了,取完還剩"+done);
}
else
Console.WriteLine(m + "沒取到貨,因爲只剩" + done);
}
}
}
}