2012-02-22 16 views
16

Czy mogę użyć tego samego obiektu blokady na dwóch metodach, do których dostęp uzyskują dwa różne wątki? Celem jest zabezpieczenie wątku task1 i task2.użyć tego samego obiektu blokady w dwóch różnych blokach kodu?

object lockObject = new object(); 

// Thread 1 
void Method1() 
{ 
    lock(lockObject) 
    { 
     // task1 
    } 
} 

// Thread 2 
void Method2() 
{ 
    lock(lockObject) 
    { 
     // task2 
    } 
} 

Odpowiedz

19

Tak, możesz użyć tego samego obiektu blokady (technicznie jest to monitor w rozumieniu informatycznym i jest realizowany za pomocą wywołań metod w System.Monitor) na dwa różne sposoby.

Załóżmy, że dysponujesz statycznym zasobem r, a chcesz uzyskać dostęp do tego zasobu przez dwa wątki, ale tylko jeden wątek może go używać jednocześnie (jest to klasyczny cel blokady). Wtedy można napisać kod jak

public class Foo 
{ 
    private static object _LOCK = new object(); 

    public void Method1() 
    { 
     lock (_LOCK) 
     { 
      // Use resource r 
     } 
    } 

    public void Method2() 
    { 
     lock (_LOCK) 
     { 
      // Use resource r 
     } 
    } 
} 

Trzeba zablokować wokół każdego użycia r w programie, ponieważ w przeciwnym razie dwa wątki mogą korzystać r w tym samym czasie. Ponadto musisz użyć tej samej blokady, ponieważ w przeciwnym razie dwa wątki będą mogły jednocześnie używać r. Tak więc, jeśli używasz r w dwóch różnych metodach, musisz używać tej samej blokady z obu metod.

EDIT: Jak @diev zwraca uwagę w komentarzach, jeśli zasób były per-instancji na obiektach typu Foo, że nie miałoby _LOCK statyczny, ale stałaby _LOCK dane wystąpienie poziomu.

+0

+1 za wykrycie "użycia"! –

+0

moje złe. Chciałem powiedzieć lock (lockObject) – RedFox

+1

Powinieneś jawnie wywołać fakt, że obiekt blokady jest 'statyczny', a tym samym zasób, który chroni, powinien również być" statyczny "; jeśli r był zasobem dostępnym na poziomie instancji, obiekt blokady poziomu instancji prawdopodobnie lepiej by działał. – dlev

5

Jeśli chcesz zapobiec różne wątki od wykonywania Zadania1 i task2 w tym samym czasie, to musi używać tego samego obiektu blokady.

Jeśli dwa zadania nie rywalizują o te same zasoby, można użyć różnych obiektów blokujących.

4

Tak.

Możesz i to działa. Jeśli nie użyjesz tego samego obiektu, bloki mogą być wykonywane w tym samym czasie. Jeśli użyjesz tego samego obiektu, nie mogą tego zrobić.

Co więcej, masz na myśli lock(lockObject), a nie using(lockObject).

Powiązane problemy