|
Het lock-keyword markeert een blok statements als een kritieke zone door een mutex voor een bepaald object te nemen, de instructie uit te voeren en vervolgens de lock los te laten.
De lock-instructie gebruikt in feite Monitor.Enter en Monitor.Exit, dat wil zeggen, Monitor.Enter(this) wordt uitgevoerd wanneer lock(this) wordt uitgevoerd, en Monitor.Exit(this) wordt uitgevoerd aan het einde van de curly brace. Wat betekent het, voor elk object is het eerste deel van het geheugen het adres van alle methoden, en het tweede deel is een index. Hij wijst naar een SyncBlock in het SyncBlock Cache-gedeelte van de CLR. Wat betekent dat? Dat wil zeggen, wanneer je Monitor.Enter(Object) uitvoert, als de indexwaarde van het object negatief is, selecteer dan een SyncBlock uit de SyncBlock-cache en plaats het adres ervan in de index van het object. Dit voltooit de vergrendeling die door object is gemarkeerd, en de andere threads willen de Monitor.Enter(object)-operatie opnieuw uitvoeren, wat een index met een positief object oplevert en dan wacht. Totdat de index negatief wordt, d.w.z. de thread gebruikt Monitor.Exit(object) om de index negatief te maken. Waar je op moet letten bij het gebruik van slot:
1. Lock kan null-waarde niet vergrendelen Een object kan naar null wijzen, maar null hoeft niet te worden losgelaten. (Zie ook: Volledige nul begrijpen) 2.lock kan het stringtype niet vergrendelen, hoewel het ook een referentietype is. Omdat het stringtype door de CLR wordt "gehoverd" Dit betekent dat er slechts één instantie van een bepaalde string in het hele programma is, en dat hetzelfde object die tekst vertegenwoordigt in alle threads van alle draaiende applicatiedomeinen. Zolang er een lock wordt geplaatst op een string met dezelfde inhoud ergens in het applicatieproces, zullen alle instanties van die string in de applicatie vergrendeld zijn. Daarom is het het beste om privé- of beschermde leden te sluiten die niet worden getolereerd. 3. Locklock het object is de geheugengrens van een programmablok 4. Het waardetype kan niet worden vergrendeld, omdat het "object wordt vrijgegeven" in het rood in de vorige tekst, en het waardetype geen referentietype is 5.lock voorkomt het vergrendelen van publieke types of objecten die niet door het programma worden bestuurd. Als de instantie bijvoorbeeld openbaar toegankelijk is, kan lock(this) problematisch zijn omdat ongecontroleerde code het object ook kan vergrendelen. Dit kan leiden tot deadlocks, waarbij twee of meer threads wachten om hetzelfde object vrij te geven. Het vergrendelen van openbare datatypes (in tegenstelling tot objecten) kan om dezelfde reden ook problemen veroorzaken. Bij gebruik van lock(this) kan de waarde van de klasselidvariabele worden gewijzigd door de methode die zich niet in de kritieke zone bevindt
Toepassingsscenario: Het wordt vaak gebruikt om onzekere uitzonderingen in de waarde van publieke variabelen te voorkomen veroorzaakt door multithreaded operaties om de beveiliging van operaties te waarborgen
|