De lock-instructie neemt de mutex van een gegeven object, voert een statementblok uit en geeft vervolgens de lock op. Wanneer je een slot vasthoudt, kan de schroefdraad die het slot vasthoudt het slot oppakken en weer loslaten. Elke andere draad wordt geblokkeerd zodat het slot niet kan worden gepakt en wacht tot het slot wordt losgemaakt.
Recensie:
Gebruik de slotcode
Equivalent aan
Men kan denken dat de onderliggende code van Lock door Monitor wordt geïmplementeerd.
Aangezien de code probeert... Finalblock, dus zelfs als er een uitzondering in de body van de lock-instructie wordt geplaatst, wordt de lock losgelaten.
Je kunt de await operator lock niet in de body van de instructie gebruiken.Je kunt het niet in de inhoud van de verklaring gebruikenwachtOperator slot。 Je kunt de await operator lock niet in de body van de instructie gebruiken. Je kunt de await operator lock niet in de body van de instructie gebruiken. Deze zin is heel belangrijk!
Documentatie:De hyperlink-login is zichtbaar.
Ik test de code zelf,Gebruik Taak om de lock te krijgen en gebruik 'wacht om te blokkeren', de code is als volgt:
Na het meerdere keren uitvoeren van de volgende code is het uitvoeringsresultaat niet zoals verwacht.
Waarom? Als je probeert het await-keyword te gebruiken wanneer je het await-sleutelwoord in het lock block probeert te gebruiken, krijg je deze compilatiefout: cannot await in de body van een lock-instructie. De reden is dat nadat await is voltooid, de methode in een andere thread kan draaien in plaats van in de thread (die thread aanroept) vóór het await-sleutelwoord.lockkeywordZelfde draadVergrendel en laat slot los in het slot。 Pas de code aan om de reden intuïtiever te zien:
Krijg de schroefdraad-id van het slot en de schroefdraad-ID van de slotontgrendeling,Natuurlijk niet in een draadje, dus de vergrendeling kan niet succesvol worden losgemaakt, zoals getoond in de onderstaande figuur:
Ik heb geprobeerd de code aan te passen, getest met thread, meerdere keren uitgevoerd, en het werkte zoals verwacht, de code is als volgt:
(Einde)
|