不要锁定标识较弱的对象
本文关键字:对象 标识 锁定 | 更新日期: 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.MemberInfo
http://msdn.microsoft.com/en-us/library/system.type.aspx因此,当使用lock (typeof(ObjectCultures))