Что не так с блокировкой нестатических полей? Каков правильный способ заблокировать конкретный экземпляр?

Почему блокирование нестатических полей считается плохой практикой?

И, если я не блокирую нестатические поля, тогда как мне заблокировать метод экземпляра, не блокируя метод для всех других экземпляров того же или производного класса?

Я написал пример, чтобы прояснить свой вопрос.

public abstract class BaseClass
{

    private readonly object NonStaticLockObject = new object();
    private static readonly object StaticLockObject = new object();

    protected void DoThreadSafeAction(Action action)
        where T: BaseClass
    {
        var derived = this as T;
        if(derived == null)
        {
            throw new Exception();
        }
        lock(NonStaticLockObject)
        {
            action(derived);
        }
    }
}
public class DerivedClass :BaseClass
{
    private readonly Queue _queue;
    public void Enqueue(object obj)
    {
        DoThreadSafeAction(x=>x._queue.Enqueue(obj));
    }
}

Если я заблокирую объект StaticLockObject , то метод DoThreadSafeAction будет заблокирован для всех экземпляров всех классов, производных от BaseClass , то есть не то, что я хочу. Я хочу убедиться, что никакие другие потоки не могут вызывать метод для конкретного экземпляра объекта, пока он заблокирован.

Обновление

Спасибо всем за вашу помощь: я опубликовал еще один вопрос в продолжение некоторой информации, которую вы все предоставили. Поскольку вы, кажется, хорошо разбираетесь в этой области, я разместил ссылку: Что не так в этом решении для блокировки заблокированных исключений и управления ими?

9
задан Community 23 May 2017 в 11:51
поделиться