Операторът lock приема mutex на даден обект, изпълнява блок с оператори и след това освобождава заключването. Когато държите заключване, резбата, която го държи, може да я закачи и освободи отново. Всяка друга нишка е блокирана от получаване на ключалката и чака, докато ключалката бъде освободена.
Преглед:
Използвай кода на заключването
Еквивалент на
Може да се предположи, че основният код на Lock е реализиран от Monitor.
Тъй като кодът използва try... Finalblock, така че дори ако изключение е хвърлено в тялото на заключващото изявление, заключването се освобождава.
Не можете да използвате заключването на оператора в тялото на изявлението.Не можете да го използвате в основната част на изявлениетоЧакайЗаключване на оператора。 Не можете да използвате заключването на оператора в тялото на изявлението. Не можете да използвате заключването на оператора в тялото на изявлението. Това изречение е много важно!
Документация:Входът към хиперлинк е видим.
Тествам кода сам,Използвай Задача, за да вземеш заключването, и използвай Wait, за да блокираш, кодът е следният:
След изпълнение на следващия код няколко пъти, резултатът от изпълнението не е такъв, какъвто се очаква.
Защо? Ако опитате да използвате ключовата дума wait, когато се опитвате да използвате ключовата дума await в блока за заключване, ще получите тази грешка при компилацията: не може да чака в тялото на заключващо изявление. Причината е, че след като waitit приключи, методът може да се изпълнява в различна нишка, вместо в нишката (извикващ нишка) преди ключовата дума waitit.ключова дума lockСъщата темаВземи заключване и освобождаване на заключването в ключалката。 Модифицирайте кода, за да видите причината по-интуитивно:
Вземи идентификатора на резбата на заключването и идентификатора на резбата на освобождаването на заключването,Очевидно не в тема, така че заключването не може да бъде успешно отключено, както е показано на фигурата по-долу:
Опитах да модифицирам кода, тествах с нишка, изпълнявах се няколко пъти и работеше както се очаква, кодът е следният:
(Край)
|