Příkaz zámku vezme mutex daného objektu, vykoná blok příkazů a poté uvolní zámek. Při držení zámku může nit, která zámek drží, zámek znovu zachytit a uvolnit. Jakékoliv jiné vlákno je zablokováno a čeká na uvolnění zámku.
Přezkoumání:
Použijte kód zámku
Ekvivalent
Lze se domnívat, že základní kód Locku je implementován pomocí Monitoru.
Protože kód používá try... Finalblock, takže i když je v těle příkazu zámku vložena výjimka, zámek je uvolněn.
Nelze použít zámek await operator v těle výroku.Nemůžete ji použít v těle tvrzeníčekatOperátorský zámek。 Nelze použít zámek await operator v těle výroku. Nelze použít zámek await operator v těle výroku. Tato věta je velmi důležitá!
Dokumentace:Přihlášení k hypertextovému odkazu je viditelné.
Kód testuji sám,Použijte Úkol k získání zámku a použijte čekání k blokování, kód je následující:
Po několika provedeních následujícího kódu není výsledek vykonání tak, jak se očekávalo.
Proč? Pokud se pokusíte použít klíčové slovo await při použití klíčového slova await v lockblocku, dostanete tuto chybu kompilace: cannot await v těle příkazu lock. Důvodem je, že po dokončení čekaní může metoda běžet v jiném vlákně místo vlákna (volajícího vlákno) před klíčovým slovem wait.lockkeywordStejné vláknoZamkni a uvolni zamkni zámek。 Upravte kód, abyste intuitivněji viděli důvod:
Získejte ID závitu zámku a ID závitu uvolnění zámku,Samozřejmě ne v žádném vlákně, takže zámek nelze úspěšně uvolnit, jak je znázorněno na obrázku níže:
Zkoušel jsem upravovat kód, testoval jsem s vláknem, spouštěl to několikrát a fungovalo to podle očekávání, kód je následující:
(Konec)
|