C# lock实现线程同步(附带实例)
lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断,它是通过在代码块运行期间为给定对象获取互斥锁来实现的。
lock 语句以关键字 lock 开头,它有一个作为参数的对象,在该参数的后面还有一个一次只能有一个线程执行的代码块。lock 语句的语法格式如下:
严格地说,提供给 lock 语句的参数只是用来唯一标识由多个线程共享的资源,所以它可以是任意类的实例,然而,实际上,此参数通常表示需要进行线程同步的资源。
【实例】设置同步块模拟售票系统。使用 lock 关键字锁定售票代码,以便实现线程同步,主要代码如下:
lock 语句以关键字 lock 开头,它有一个作为参数的对象,在该参数的后面还有一个一次只能有一个线程执行的代码块。lock 语句的语法格式如下:
Object thisLock = new Object(); lock(thisLock){ //要运行的代码块 }提供给 lock 语句的参数必须为基于引用类型的对象,该对象用来定义锁的范围。
严格地说,提供给 lock 语句的参数只是用来唯一标识由多个线程共享的资源,所以它可以是任意类的实例,然而,实际上,此参数通常表示需要进行线程同步的资源。
【实例】设置同步块模拟售票系统。使用 lock 关键字锁定售票代码,以便实现线程同步,主要代码如下:
class Program { int num = 10; //设置当前总票数 void Ticket() { while (true) { lock (this) //锁定代码块,以便线程同步 { if (num > 0) //判断当前票数是否大于0 { Thread.Sleep(100); //使当前线程休眠100毫秒 //票数减1 Console.WriteLine(Thread.CurrentThread.Name + "----票数" + num--); } } } } static void Main(string[] args) { Program p = new Program(); //创建对象,以便调用对象方法 Thread tA = new Thread(new ThreadStart(p.Ticket)); //分别实例化4个线程,并设置名称 tA.Name = "线程一"; Thread tB = new Thread(new ThreadStart(p.Ticket)); tB.Name = "线程二"; Thread tC = new Thread(new ThreadStart(p.Ticket)); tC.Name = "线程三"; Thread tD = new Thread(new ThreadStart(p.Ticket)); tD.Name = "线程四"; tA.Start(); //分别启动线程 tB.Start(); tC.Start(); tD.Start(); Console.ReadLine(); } }程序运行效果为:
线程一------票数10
线程二------票数9
线程三------票数8
线程四------票数7
线程一------票数6
线程二------票数5
线程三------票数4
线程四------票数3
线程一------票数2
线程二------票数1