Не блокируйте объекты со слабой идентичностью

Как я могу решить эту проблему надежности ( не блокировать объекты со слабой идентичностью)?
Должен ли я заблокировать его с помощью "объекта 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))

Другие вопросы по тегам