如何解决此可靠性问题(Do not lock on objects with weak identity)? 我应该用"对象锁定器=新对象();"?
来锁定它lock (typeof(ObjectCultures))
{
if (!requestCache.Contains(GetCacheKey(objectId, cultureId)))
{
requestCache.Add(GetCacheKey(objectId, cultureId), responseStr);
}
}
答案 0 :(得分:2)
创建对象的新静态实例并锁定该对象:
private static readonly object locker = new object();
lock (locker)
{
....
}
这是假设您在静态方法中锁定(由于您使用typeof(T)
而不是this
,这也是不好的做法)。
显然,如果您在实例方法中,请从声明中删除static
。
答案 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))