不要锁定标识较弱的对象

本文关键字:对象 标识 锁定 | 更新日期: 2023-09-27 18:21:58

如何解决此可靠性问题(不要锁定具有弱标识的对象)
我应该用"object locker=new object();"来锁定它吗?

lock (typeof(ObjectCultures))
 {
     if (!requestCache.Contains(GetCacheKey(objectId, cultureId)))
         {
             requestCache.Add(GetCacheKey(objectId, cultureId), responseStr);
         }
 }

不要锁定标识较弱的对象

创建一个对象的新静态实例并锁定它:

private static readonly object locker = new object();
lock (locker)
{
    ....
}

这是基于您在静态方法中锁定的假设(由于您使用typeof(T)而不是this,这也是一种糟糕的做法)。

显然,如果您在实例方法内部,请从声明中移除static

Jon Skeet的这篇文章将有助于解释为什么这个问题首先被标记出来。

您应该锁定object而不是type。在类的主作用域中声明并实例化此对象,例如:

public class SomeClass
{
    private static readonly object _lock = new object();
    public void SomeMethod()
    {
       lock (_lock)
       {
           // some code
       }
    }
}

此代码将阻止所有试图执行此块的线程,并使它们等待完成,然后执行下一个线程。

实际上,您需要将锁放在静态对象引用中。object类型的引用应该足够了。

public class X
{
     private readonly static _syncLock = new object();
     public void DoStuff()
     {
          lock(_syncLock) 
          {
             // Critical section
          }
     }
}

应该如何锁定。。这取决于上下文,以及您试图编写的代码的大局。。

你想要避免的是锁定你已经得到的链接中指示的类型的对象-http://msdn.microsoft.com/en-us/library/ms182290.aspx

请注意,这里列出的少数类型并不是完整的列表。。。

•MarshalByRefObject

•ExecutionEngineException

•内存不足异常

•堆叠溢流异常

•字符串

•会员信息

•参数信息

•线程

完整列表将包括直接或间接从上述任何类型派生的任何类型的实例。。注意,System.Type扩展了System.Reflection.MemberInfohttp://msdn.microsoft.com/en-us/library/system.type.aspx因此,当使用lock (typeof(ObjectCultures))

时会发出警告