c# Thread 线程(三) lock线程锁

时间:2021-12-14 18:19:09

在多线程编程中,可能会有多个线程并发的(或同时)执行一段代码,但是某些情况下需要在同一时刻只能有一个线程执行,避免某些对象的调用冲突或内存使用冲突,这就需要用到锁(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秒才会有输出,通过属性线程名字可以确定是不同线程执行的,如果去掉线程锁,则会同时输出。