2012-06-12 16 views
5

Bir yöntemin iki kez aynı anda yürütülmesini önlemenin tek yolunun lock ifadesi kullanılarak mı olduğunu düzeltir miyim? Tabiiyönteminin aynı anda farklı iş parçacıklarından yürütülmesini engellemesi

private object lockMethod = new object(); 

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

public void FromThread1() { 
    Method(); 
} 

public void FromThread2() { 
    Method(); 
} 

Ben de hemen hemen aynı olacağını MethodImpl(MethodImplOptions.Synchronized) kullanabilirsiniz.

Başka teknikler var mı?

+7

_data_ 'ı kilitlemek yerine _method_' ı kilitlemeye çalıştığınız için endişeleniyorum - ne tür bir problem çözmeye çalışıyorsunuz? – sarnold

+0

Herhangi bir "statik" yöntem göstermediğinizden, aynı anda aynı örnek için iki kez bir yöntemi yürütmeyi engellemeye mi çalışıyorsunuz? Veya aynı anda tek bir örnek için herhangi iki yöntem? – HABO

+0

yöntemi o kadar küçük ki benim durumumda yöntemi kilitlemek = verileri kilitlemek – javapowered

cevap

9

Yöntemin iki kez aynı anda yürütülmesini engellemenin tek yönteminde kilit ifadesi kullanılıyor mu?

Hayır, ama bu "standart" yoldur ve muhtemelen en iyisidir. Bu, genellikle bir yönteme değil, özel verisine erişimini senkronize etmek için bir kilit kullandığınız söylenir. Tüm yöntemin kilitlenmesi, gerekenden daha fazla engellemeye neden olabilir. diğer yöntemlere gelince

, System.Threading ad ReaderWriterLockSlim, Semaphore, Mutex, dahil olmak üzere çeşitli formlarda senkronizasyon için kullanılan diğer birçok türde içerir vb tüm verileri senkronize etmek için çeşitli yollar sunar (lock dahili olarak kullandığı şeydir) Monitor class Ancak her biri farklı bir senaryo için tasarlandı. Bu durumda, lock, kullanılacak uygun yöntemdir.

İlgili konular