Instrukcja blokady przyjmuje mutex danego obiektu, wykonuje blok instrukcji, a następnie zwalnia blokadę. Podczas trzymania zamka nić trzymająca zamek może go ponownie złapać i zwolnić. Każdy inny gwint jest zablokowany i czeka, aż zamek zostanie zwolniony.
Recenzja:
Użyj kodu zamka
Równoważne
Można sądzić, że podstawowy kod Lock jest zaimplementowany przez Monitor.
Ponieważ kod stosuje się try... Finalblock, więc nawet jeśli w treści instrukcji blokady zostanie wrzucony wyjątek, blokada zostaje zwolniona.
Nie możesz użyć blokady operatora await w treści zdania.Nie możesz użyć go w treści oświadczeniaczekajcieBlokada operatora。 Nie możesz użyć blokady operatora await w treści zdania. Nie możesz użyć blokady operatora await w treści zdania. To zdanie jest bardzo ważne!
Dokumentacja:Logowanie do linku jest widoczne.
Sam testuję kod,Użyj Zadania, aby zdobyć blokadę, i użyj czekaj, aby zablokować, kod jest następujący:
Po kilku wykonaniach następującego kodu wynik wykonania nie jest taki, jak się spodziewał.
Dlaczego? Jeśli spróbujesz użyć słowa kluczowego await podczas próby użycia słowa await w bloku blokady, otrzymasz ten błąd kompilacji: nie można czekać w treści instrukcji blokady. Powodem jest to, że po zakończeniu await metoda może działać w innym wątku zamiast wątku (wywołującego wątek) przed słowem kluczowym oczekuj.lockkeywordTen sam wątekZablokuj i zwolnij zablokuj zamek。 Zmodyfikuj kod, aby zrozumieć powód bardziej intuicyjnie:
Uzyskaj identyfikator nici zamka oraz identyfikator nitki zwalniającego zamka,Oczywiście nie na wątku, więc blokady nie można skutecznie zwolnić, jak pokazano na poniższym rysunku:
Próbowałem modyfikować kod, testować z wątkiem, wykonać to wielokrotnie i wszystko działało zgodnie z oczekiwaniami, kod wygląda następująco:
(Koniec)
|