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.
+1 za wykrycie "użycia"! –
moje złe. Chciałem powiedzieć lock (lockObject) – RedFox
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