重新学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 + " ");
}
}
}
}
}

浙公网安备 33010602011771号