不要锁定身份较弱的物体

时间:2014-09-16 11:14:52

标签: c# asp.net multithreading reliability

如何解决此可靠性问题(Do not lock on objects with weak identity)? 我应该用"对象锁定器=新对象();"?

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

4 个答案:

答案 0 :(得分:2)

创建对象的新静态实例并锁定该对象:

private static readonly object locker = new object();

lock (locker)
{
    ....
}

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

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

Jon Skeet撰写的{p {3}}文章将帮助解释为什么问题首先被标记。

答案 1 :(得分:0)

您应该锁定object而不是type。对于示例:

,在类的主范围内声明并实例化此对象
public class SomeClass
{
    private static readonly object _lock = new object();

    public void SomeMethod()
    {
       lock (_lock)
       {
           // some code
       }
    }
}

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

答案 2 :(得分:0)

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

public class X
{
     private readonly static _syncLock = new object();

     public void DoStuff()
     {
          lock(_syncLock) 
          {
             // Critical section
          }
     }
}

答案 3 :(得分:0)

你应该如何锁定..取决于上下文,以及你想要编写的代码的大图..

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

请注意,此处列出的少数类型不是完整列表......

•MarshalByRefObject

•ExecutionEngineException

•OutOfMemoryException

•StackOverflowException

•字符串

•MemberInfo

•ParameterInfo

•线程

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

时会发出警告