В чем разница между блокировкой (this) и блокировкой (thisLock)? - PullRequest
8 голосов
/ 25 июля 2011

Я читаю Заявление о блокировке (C # Reference) , где я видел этот код:

class Account
{
    private Object thisLock = new Object();

    //...

    int Withdraw(int amount)
    {
        lock (thisLock)
        {
           //....
        }
    }

    //...
}

Мне интересно, будет ли иметь значение, если мы напишем lock(this) вместо lock(thisLock) в приведенном выше примере. Пожалуйста, смотрите полный пример , если ваш ответ зависит от него.

Если вы думаете, что действительно есть какая-то разница между lock(this) и lock(thisLock), тогда, пожалуйста, помогите мне понять разницу со всеми важными моментами. В частности, что означает каждый точно ?

Ответы [ 2 ]

14 голосов
/ 25 июля 2011

Различие связано с тем, что lock, в случае неправильного использования, может привести к взаимоблокировке потока.Если видимость цели блокировки вам неизвестна (т. Е. Вы не можете быть на 100% уверены, кто имеет ссылку на цель, и если / когда они могут lock ее), то вы не можете точно знать, может ли приложение зайти в тупик.

По этой причине обычно блокируется элемент private: поскольку он является личным и находится в вашем коде, вы делаете знаете, что никто другой не может lock его.

Конечно, в большинстве случаев это чисто академическая разница (обычно люди не обходят блокировку случайных объектов), но это хорошая практика защитного кодирования.

Страница, на которую вы ссылаетесь:

В общем, избегайте блокировки на общедоступный тип или экземпляры, не зависящие от вашего кода.Общие конструкции lock (this), lock (typeof (MyType)) и lock ("myLock") нарушают это правило:

lock (this) является проблемой, если к экземпляру можно получить открытый доступ.

Поскольку кто-то другой может заблокировать экземпляр, используя имеющуюся у него ссылку, и ваш код, который делает lock(this), конечно, не будет ожидать этого. Пример для IDEone (см. Строку 26).

Блокировка (typeof (MyType)) является проблемой, если MyType общедоступен.

Разновидность вышеприведенного: если тип виден другому коду, вы можете попытаться заблокировать тот же экземпляр, что и этот код (typeof возвращает одиночные экземпляры).

Блокировка ("myLock") является проблемой, потому что любой другой код в процессе, использующий ту же строку, будет иметь ту же самую блокировку.

Еще один вариант: из-за интернирования строк код в конечном итоге пытаетсязаблокируйте тот же экземпляр.

Рекомендуется определить закрытый объект для блокировки или переменную закрытого статического объекта для защиты данных, общих для всех экземпляров.

2 голосов
/ 25 июля 2011

Когда вы делаете lock(this), у вас нет полного контроля над this, потому что вы не знаете, кто еще будет использовать this или экземпляр вашего класса.Безопасно использовать локальный объект, потому что этот локальный объект будет доступен только внутри вашего класса, следовательно, вы будете иметь полный контроль над ним

см. this для деталей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...