在多线程编程中,可能会有多个线程并发的(或同时)执行一段代码,但是某些情况下需要在同一时刻只能有一个线程执行,避免某些对象的调用冲突或内存使用冲突,这就需要用到锁(lock)。lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。在同一个时刻内只允许一个线程进入执行,而其他线程必须等待。
public partial class TestWindow : Window
{
private static object lockObj = new object();//定义锁
private int _totalNum = 0;
public TestWindow()
{
InitializeComponent();
}
private void OnTest()
{
while (true)
{
lock (lockObj)
{
_totalNum++;
string name = Thread.CurrentThread.Name;
Console.WriteLine("_totalNum:{0}", _totalNum);
Thread.Sleep(3000);
}
}
}
private void btnTest1_Click(object sender, RoutedEventArgs e)
{
//多个线程
Thread t1 = new Thread(OnTest);
t1.Name = "td1";
t1.IsBackground = true;
t1.Start();
Thread t2 = new Thread(OnTest);
t2.Name = "td2";
t2.IsBackground = true;
t2.Start();
}
}
以上例子测试结果就是有线程锁的情况,间隔3秒才会有输出,通过属性线程名字可以确定是不同线程执行的,如果去掉线程锁,则会同时输出。