2012-06-12 2 views
5

Правильно ли, что единственный способ предотвратить одновременный запуск метода одновременно - с помощью инструкции lock?предотвращает одновременный запуск метода из разных потоков

private object lockMethod = new object(); 

public void Method() { 
    lock (lockMethod) { 
     // work 
    } 
} 

public void FromThread1() { 
    Method(); 
} 

public void FromThread2() { 
    Method(); 
} 

Конечно, я могу также использовать MethodImpl(MethodImplOptions.Synchronized), что было бы почти то же самое.

Есть ли другие методы?

+7

Я немного обеспокоен тем, что вы пытаетесь заблокировать _method_, а не блокировать _data_ - какую проблему вы пытаетесь решить? – sarnold

+0

Поскольку вы не показываете какие-либо методы 'static', вы действительно пытаетесь предотвратить выполнение метода дважды для одного и того же экземпляра одновременно? Или любые два метода для одного экземпляра одновременно? – HABO

+0

метод настолько мал, что в моей ситуации блокировка метода = блокировка данных – javapowered

ответ

9

Я исправлю, что единственный способ предотвратить одновременный запуск метода в одно и то же время - использовать инструкцию блокировки?

Нет, но это «стандартный» способ и, вероятно, лучший. При этом обычно используется блокировка для синхронизации доступа к конкретным данным, а не к методу в целом. Блокировка всего метода, скорее всего, приведет к большей блокировке, чем необходимо.

Что касается других методов, то System.Threading пространство имен содержит много других типов, используемые для синхронизации в различных формах, в том числе ReaderWriterLockSlim, Semaphore, Mutex, тем Monitor class (который является то, что lock использует внутренне), и т.д. Все обеспечивают различные способы синхронизации данных , хотя каждый из них ориентирован на другой сценарий. В этом случае lock является подходящим способом использования.

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