|
Słowo kluczowe oznaczające blok instrukcji jako strefę krytyczną, wykonując mutex dla danego obiektu, wykonując polecenie, a następnie zwalniając blokadę.
Instrukcja lock zasadniczo używa Monitor.Enter i Monitor.Exit, czyli Monitor.Enter(this) jest wykonywana podczas wykonywania lock(this), a Monitor.Exit(this) wykonuje się na końcu nawiasu zakrętowego. Co to oznacza, dla dowolnego obiektu pierwsza część pamięci to adres wszystkich metod, a druga część to indeks. Wskazuje na SyncBlock w obszarze pamięci podręcznej SyncBlock w CLR. Co to znaczy? To znaczy, gdy wykonujesz Monitor.Enter(Object), jeśli wartość indeksu obiektu jest ujemna, wybierz SyncBlock z pamięci podręcznej SyncBlock i umieść jego adres w indeksie obiektu. To kończy blokadę oznaczoną obiektem, a pozostałe wątki chcą ponownie wykonać operację Monitor.Enter(object), która uzyska indeks z dodatnim obiektem, a następnie czekają. Dopóki indeks nie stanie się ujemny, tzn. wątek używa Monitor.Exit(object), aby zmienić indeks na ujemny. Na co należy zwrócić uwagę podczas używania zamka:
1.lock nie może zablokować wartości null Obiekt może wskazać null, ale null nie musi być zwalniany. (Zobacz także: Rozumienie pełnego nulla) 2.lock nie może zablokować typu ciągu, choć jest on również typem referencyjnym. Ponieważ typ ciągu jest "najeden" przez CLR Oznacza to, że w całym programie istnieje tylko jedna instancja danego ciągu znaków, a ten sam obiekt reprezentuje ten tekst we wszystkich wątkach wszystkich działających domen aplikacji. Dlatego dopóki blokada jest umieszczona na ciągu o tej samej zawartości gdziekolwiek w procesie aplikacji, wszystkie instancje tego ciągu w aplikacji będą zablokowane. Dlatego najlepiej jest zamykać prywatnych lub chronionych członków, którzy nie będą trwali. 3.locklock obiekt to granica pamięci bloku programu 4. Typ wartości nie może być zablokowany, ponieważ "obiekt jest zwolniony" na czerwono w poprzednim tekście, a typ wartości nie jest typem referencyjnym 5.lock unika blokowania typów publicznych lub obiektów, które nie są kontrolowane przez program. Na przykład, jeśli instancja jest publicznie dostępna, blokada (to) może być problematyczna, ponieważ niekontrolowany kod również może zablokować obiekt. Może to prowadzić do zakleięć, gdzie dwa lub więcej wątków czeka na zwolnienie tego samego obiektu. Blokowanie publicznych typów danych (w przeciwieństwie do obiektów) również może powodować problemy z tego samego powodu. Przy użyciu lock(this) wartość zmiennej członka klasy może zostać zmieniona przez metodę, która nie znajduje się w strefie krytycznej
Scenariusz aplikacji: Często stosuje się go do zapobiegania niepewnym wyjątkom w wartości zmiennych publicznych spowodowanym operacjami wielowątkowymi, aby zapewnić bezpieczeństwo operacji
|