首页 > 编程笔记 > C#笔记 阅读:4

C# 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

从运行结果可以看出,打印到最后,票数没有出现负数,这是因为将售票代码放置在了同步块中。

相关文章