Не блокируйте объекты со слабой идентичностью
Как я могу решить эту проблему надежности ( не блокировать объекты со слабой идентичностью)?
Должен ли я заблокировать его с помощью "объекта locker = new object();"?
lock (typeof(ObjectCultures))
{
if (!requestCache.Contains(GetCacheKey(objectId, cultureId)))
{
requestCache.Add(GetCacheKey(objectId, cultureId), responseStr);
}
}
4 ответа
Вы должны заблокировать object
не type
, Объявите и создайте экземпляр этого объекта в основной области видимости вашего класса, например:
public class SomeClass
{
private static readonly object _lock = new object();
public void SomeMethod()
{
lock (_lock)
{
// some code
}
}
}
Этот код заблокирует все потоки, которые пытаются выполнить этот блок, заставит их ждать завершения и затем выполнит следующий поток.
Создайте новый статический экземпляр объекта и заблокируйте его:
private static readonly object locker = new object();
lock (locker)
{
....
}
Это при условии, что вы блокируете внутри статического метода (из-за вашего использования typeof(T)
вместо this
что тоже плохая практика).
Очевидно, что если вы находитесь внутри метода экземпляра, удалите static
из декларации.
Эта статья Джона Скита поможет объяснить, почему проблема помечается в первую очередь.
По сути, вам нужно поставить блокировку в ссылку на статический объект. 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
• OutOfMemoryException
• StackruException
• Строка
• MemberInfo
• ParameterInfo
• Нить
Полный список будет включать экземпляр любого типа, который прямо или косвенно получен из любого из вышеупомянутых типов. Обратите внимание, что System.Type
продолжается System.Reflection.MemberInfo
http://msdn.microsoft.com/en-us/library/system.type.aspx И, следовательно, предупреждение при использовании lock (typeof(ObjectCultures))