2016-05-19 2 views
1

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

public class Foo { 
    readonly object locker = new Object(); 
    public void DoSomething() { 
     lock(locker) { 
     //... 
     } 
    } 
    public void DoSomethingElse() { 
     lock(locker) { 
     //... 
     } 
    } 
} 

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

В моих экспериментах это будет работать так же хорошо, если бы я сделал lock(this) вместо того, чтобы иметь объект-шкафчик. Есть ли что-то, что мне не хватает, или это прекрасно?

ответ

1

Проблема в том, что у вас нет эксклюзивного контроля над this. Другие типы также могут блокировать ваш объект и создавать хаос.

Microsoft есть что сказать об этом на своей странице о lock statement.

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

lock (this) is a problem if the instance can be accessed publicly. 

lock (typeof (MyType)) is a problem if MyType is publicly accessible. 

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock. 

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

Смежные вопросы