重新学C#编程162-lock:给线程加锁,保证线程同步

前面学习过程中,曾经联系过使用sleep 方法能控制线程的暂停时间,从而改变多个线程之间的先后顺序,但每次调用线程的结果是随机的。线程同步的方法是将线程资源共享,允许控制每次执行一个线程,并交替执行每个线程。

在 C# 语言中实现线程同步可以使用 lock 关键字和 Monitor 类、Mutex 类来解决。

对于线程同步操作最简单的一种方式就是使用 lock 关键字,通过 lock 关键字能保证加锁的线程只有在执行完成后才能执行其他线程。

lock 的语法形式如下

lock(object)
{
    //临界区代码
}

这里 lock 后面通常是一个 Object 类型的值,也可以使用 this 关键字来表示。

最好是在 lock 中使用私有的非静态或负变量或私有的静态成员变量,即使用 Private 或 Private static 修饰的成员。

例如:

private Object obj = new Object();
lock (obj)
{
    //临界区代码
}

新建一个项目,实现先输出显示1-100偶数线程,再显示1-100奇数线程。

完整代码如下

using System;
using System.Threading;
namespace Lock线程练习
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Lock线程练习");
      Program program = new Program();
      ThreadStart threadStart1 = new ThreadStart(program.showEven);
      Thread thread1 = new Thread(threadStart1);
      thread1.Name = "显示偶数的线程:";
      thread1.Start();

      ThreadStart threadStart2 = new ThreadStart(program.showOdd);
      Thread thread2 = new Thread(threadStart2);
      thread2.Name = "显示奇数的线程:";
      thread2.Start();
    }
    public void showEven()//非静态
    {
      lock (this)
      {
        for(int i=2;i<=100;i+=2)
        {
          Console.WriteLine(Thread.CurrentThread.Name+i + " ");
        }
      }

    }
    public void showOdd()//非静态
    {
      lock(this)
      {
        for(int i=1;i<=100;i+=2)
        {
          Console.WriteLine(Thread.CurrentThread.Name + i + " ");
        }
      }
    }
  }
}

 

posted @ 2021-07-05 13:52  来自金沙江的小鱼  阅读(345)  评论(0编辑  收藏  举报