Можно ли выполнять lock на list?

Как лучше выполнять lock
Так?
// Создали список на уровне класса
private readonly List<T> _inner;

// Лочимся на объект списка
lock (_inner)
{
    _inner.Clear();
}


Или так?
// Создали список на уровне класса
private readonly List<T> _inner;

// Создали объект для блокировки
private readonly object _lock = new object();

// Лочимся на свой объект
lock (_lock)
{
    _inner.Clear();
}


Если второй вариант, то почему? Чем плох lock на сам список и в чем разница? Для чего в данном случае создают свой объект?
  • Вопрос задан
  • 644 просмотра
Решения вопроса 1
impwx
@impwx
Разработчик
Допустим, _inner используется у вас во многих местах, и есть некий публичный метод, который его возвращает. Тогда внешний код сможет вызвать этот метод, получить тот же экземпляр объекта _inner и поставить на него свой lock. Так можно случайно словить взаимоблокировку и повесить приложение.

Подобные моменты бывает очень сложно отследить, потому объект может быть возвращен косвенно, по интерфейсу, или как-либо еще. Отдельное поле _lock - это просто правило хорошего тона, его создают для безопасности: очень маловероятно, что кому-то придет в голову использовать его за пределами инструкции lock и тем более вернуть из метода.

Если у вас небольшой код и вы уверены, что знаете, что делаете - разницы нет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MIsternik
Почему бы не использовать ConcurrentBag ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы