LZY'Blog

记录LZY的生活、行程!

« 线程的优先级使用Monitor类实现线程同步 »

使用C#中的lock关键字实现线程同步

  lock关键字可以用来确保代码块完整运行,而不会被其他线程中断,它是通过在代码块运行期间为给定对象获取互斥锁来实现的。

  lock语句以关键字lock开头,它有一个作为参数的对象,在该参数的后面还有一个一次只能由一个线程执行的代码块。

  lock语句的语法格式如下:

Object thisLock = new Object();
lock(thisLock)
{
    //要运行的代码块
}

  提供给lock语句的参数必须为基于引用类型的对象,该对象用来定义锁的范围。严格地说,提供给lock语句的参数只是用来唯一标识由多个线程共享的资源,所以它可以是任意类实例。然而,该参数通常表示需要进行线程同步的资源。例如,如果一个容器对象被多个线程使用,则可以将该容器传递给lock语句,而lock语句中的代码块将访问该容器。如果其他线程在访问该容器前先锁定该容器,而对该对象的访问将是安全同步的。

  通常,最好避免锁定public类型或不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则lock(this)可能会有问题。因为不受控制的代码也可能会锁定该对象,这将可能导致死锁,即两个或更多个线程等待释放同一个对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题,锁定字符串尤其危险。因为字符串被公共语言运行库(CLR)“暂留”,这意味着整个程序中任何给定字符串都只有一个实例。因此,如果在应用程序进程中的任何具有相同内容的字符串上放置锁,那么将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。

说明

  事实上lock语句是用Monitor类来实现的,它等效于try/finally语句块。使用lock关键字通常比直接使用Monitor类更可取,一方面是因为lock更简洁;另一方面是因为lock确保了即使受保护的代码引发异常,也可以释放基础监视器。这是通过finally关键字来实现的,无论是否引发异常它都执行关联的代码块。

  【例】创建一个控制台应用程序,其中自定义一个LockThread方法,该方法中使用lock关键字锁定当前线程,然后在Main方法中通过Program的类对象调用LockThread自定义方法。

  代码如下:

class Program
{
    static void Main(string[] args)
    {
        Program myProgram = new Program();      //实例化类对象
        myProgram.LockThread();                 //调用锁定线程方法
    }

    void LockThread()
    {
        lock (this)                            //锁定当前线程,以实现同步
        {
            Console.WriteLine("锁定线程以实现线程同步");
        }
    }
}

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427 |

Copyright 2009-2012 LZY'Blog. | ICP:蜀ICP备05027543号