Почему блокирование нестатических полей считается плохой практикой?
И, если я не блокирую нестатические поля, тогда как мне заблокировать метод экземпляра, не блокируя метод для всех других экземпляров того же или производного класса?
Я написал пример, чтобы прояснить свой вопрос.
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
Если я заблокирую объект StaticLockObject
, то метод DoThreadSafeAction
будет заблокирован для всех экземпляров всех классов, производных от BaseClass
, то есть не то, что я хочу. Я хочу убедиться, что никакие другие потоки не могут вызывать метод для конкретного экземпляра объекта, пока он заблокирован.
Обновление
Спасибо всем за вашу помощь: я опубликовал еще один вопрос в продолжение некоторой информации, которую вы все предоставили. Поскольку вы, кажется, хорошо разбираетесь в этой области, я разместил ссылку: Что не так в этом решении для блокировки заблокированных исключений и управления ими?