现在的位置: 首页 > 综合 > 正文

Lock关键字使用时应注意的几个地方(不完全版,发现再补充)

2012年04月10日 ⁄ 综合 ⁄ 共 1722字 ⁄ 字号 评论关闭

1.Lock不能锁定空值

  Lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放

某一对象可以指向Null,但Null是不需要被释放的。(请参考:认识全面的null

2.Lock不能锁定string类型,虽然它也是引用类型的。因为字符串类型被CLR“暂留”

这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。

3.Lock就避免锁定 public 类型或不受程序控制的对象。

例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。

4.Lock锁定的对象是一个程序块的内存边界

5.值类型不能被Lock,因为前文标红字的“对象被释放”,值类型不是引用类型的

 

 

综上所述,使用Lock最好是使用下面这种模式

class Test
{
    //定义一个私有成员变量,用于Lock
    private static object lockobj = new object();

    void DoSomething()
    {
        lock (lockobj)
        { 
            //锁定的代码块
        }
    }
}

抱歉!评论已关闭.