|
Klíčové slovo lock označuje blok příkazů jako kritickou zónu tím, že pro daný objekt vezme mutex, vykoná příkaz a poté uvolní zámek.
Příkaz lock v podstatě používá Monitor.Enter a Monitor.Exit, tedy Monitor.Enter(this) se vykoná při vykonání lock(this) a Monitor.Exit(this) se vykoná na konci curly brace. Co znamená, že pro jakýkoli objekt je první část paměti adresa všech metod a druhá část je index. Ukazuje na SyncBlock v oblasti cache SyncBlock v CLR. Co to znamená? To znamená, že když spustíte Monitor.Enter(Object), pokud je indexová hodnota objektu záporná, vyberte SyncBlock z cache SyncBlock a vložte jeho adresu do indexu objektu. Tím se dokončí zámek označený objektem a ostatní vlákna chtějí znovu provést operaci Monitor.Enter(object), která získá index s kladným objektem, a pak počkají. Dokud index nebude záporný, tj. vlákno použije Monitor.Exit(objekt) k změně indexu na záporný. Na co byste měli dávat pozor při používání zámku:
1.lock nemůže uzamknout nullovou hodnotu Objekt může ukázat na null, ale null nemusí být uvolněn. (Viz také: Pochopení plného nullu) 2.lock nemůže uzamknout typ řetězce, i když je také referenčním typem. Protože typ řetězce je "přejížděn" CLR To znamená, že v celém programu existuje pouze jedna instance daného řetězce a tento stejný objekt reprezentuje tento text ve všech vláknech všech běžících aplikačních domén. Proto pokud je zámek umístěn na řetězci se stejným obsahem kdekoli v procesu aplikace, všechny instance tohoto řetězce v aplikaci budou zamčeny. Proto je nejlepší uzamknout soukromé nebo chráněné členy, kteří nebudou vydržováni. 3.locklock objekt je paměťová hranice programového bloku 4. Typ hodnoty nelze uzamknout, protože "objekt je uvolněn" červeně v předchozím textu a typ hodnoty není referenčním typem 5.lock zabraňuje uzamčení veřejných typů nebo objektů, které nejsou programem řízeny. Například pokud je instance veřejně přístupná, může být uzamčení (toto) problematické, protože nekontrolovaný kód může také uzamknout objekt. To může vést k zablokování, kdy dvě nebo více vláken čekají na uvolnění stejného objektu. Zamykaní veřejných datových typů (na rozdíl od objektů) může také způsobovat problémy ze stejného důvodu. Při použití lock(this) může být hodnota proměnné člena třídy změněna metodou, která není v kritické zóně
Scénář aplikace: Často se používá k prevenci nejistých výjimek v hodnotě veřejných proměnných způsobených vícevláknovými operacemi, aby byla zajištěna bezpečnost operací
|