Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 20027|Odpoveď: 0

[Zdroj] Kľúčové slovo C# lock označuje blok príkazov ako kritickú oblasť získaním mutexu pre daný objekt, vykonaním príkazu, ale...

[Kopírovať odkaz]
Zverejnené 31. 12. 2015 17:51:01 | | |
Kľúčové slovo lock označuje blok príkazov ako kritickú zónu tým, že vezme mutex pre daný objekt, vykoná príkaz a potom uvoľní zámok.

Príkaz lock v podstate používa Monitor.Enter a Monitor.Exit, teda Monitor.Enter(this) sa vykoná pri vykonaní lock(this) a Monitor.Exit(this) sa vykoná na konci curly brace. Čo znamená, že pre akýkoľvek objekt je prvá časť pamäte adresa všetkých metód a druhá časť je index. Ukazuje na SyncBlock v oblasti cache SyncBlock v CLR. Čo to znamená? To znamená, že keď spustíte Monitor.Enter(Object), ak je indexová hodnota objektu záporná, vyberte SyncBlock z cache SyncBlock a umiestnite jeho adresu do indexu objektu. Tým sa dokončí zámok označený objektom a ostatné vlákna chcú opäť vykonať operáciu Monitor.Enter(object), ktorá získa index s kladným objektom, a potom počkať. Až kým index nedosiahne zápor, t. j. vlákno použije Monitor.Exit(objekt) na zníženie indexu na záporný.

Na čo by ste si mali dať pozor pri používaní zámku:
1.lock nemôže uzamknúť nullovú hodnotu Objekt môže ukazovať na null, ale null nemusí byť uvoľnený. (Pozri tiež: Pochopenie plného nullu)
2.lock nemôže uzamknúť typ reťazca, hoci je tiež referenčným typom. Pretože typ reťazca je "vznášaný" CLR
To znamená, že v celom programe existuje len jedna inštancia daného reťazca a ten istý objekt reprezentuje tento text vo všetkých vláknach všetkých bežiacich aplikačných domén. Preto, pokiaľ je zámok umiestnený na reťazec s rovnakým obsahom kdekoľvek v procese aplikácie, všetky inštancie tohto reťazca v aplikácii budú uzamknuté. Preto je najlepšie uzamknúť súkromných alebo chránených členov, ktorí nebudú vytrvalí.
3.locklock objekt je pamäťová hranica programového bloku
4. Typ hodnoty nie je možné uzamknúť, pretože "objekt je uvoľnený" červenou farbou v predchádzajúcom texte a typ hodnoty nie je referenčný typ
5.lock zabraňuje zamykaniu verejných typov alebo objektov, ktoré program nekontroluje.
Napríklad, ak je inštancia verejne prístupná, lock(this) môže byť problematický, pretože nekontrolovaný kód môže tiež uzamknúť objekt. To môže viesť k patovým situáciám, kde dve alebo viac vlákien čakajú na uvoľnenie toho istého objektu. Zamykanie verejných dátových typov (na rozdiel od objektov) môže tiež spôsobovať problémy z rovnakého dôvodu.
Pri použití lock(this) môže byť hodnota premennej člena triedy zmenená metódou, ktorá nie je v kritickej zóne

Aplikačný scenár: Často sa používa na zabránenie neistým výnimkám v hodnote verejných premenných spôsobeným viacvláknovými operáciami, aby sa zabezpečila bezpečnosť operácií









Predchádzajúci:Win8 spúšťa službu SQL Server 2012
Budúci:[Speed] IP segment open port skener pre rýchlu rýchlosť skenovania!!
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com