|
Lukustusmärksõna märgib lauseploki kriitiliseks tsooniks, võttes konkreetse objekti mutexi, käivitades lause ja vabastades lukustuse.
Lukustuslause kasutab põhimõtteliselt Monitor.Enter ja Monitor.Exit, st Monitor.Enter(this) täidetakse, kui lock(this) käivitatakse, ja Monitor.Exit(this) täidetakse curly brace lõpus. Mis on selle tähendus, iga objekti puhul on mälu esimene osa kõigi meetodite aadress ja teine osa indeks. Ta osutab SyncBlockile CLR-i SyncBlocki vahemälu alal. Mida see tähendab? See tähendab, et kui käivitad Monitor.Enter(Object) ja objekti indeksväärtus on negatiivne, vali SyncBlock vahemälust SyncBlock ja paiguta selle aadress objekti indeksisse. See lõpetab objektiga märgitud luku ning teised lõimed soovivad uuesti teha Monitor.Enter(object) operatsiooni, mis annab positiivse objektiga indeksi ja ootab. Kuni indeks muutub negatiivseks, st lõim kasutab indeksi negatiivseks muutmiseks Monitor.Exit(object). Mida pead lukku kasutades tähelepanu pöörama:
1.lock ei saa nullväärtust lukustada Objekt võib osutada nullile, kuid nulli ei pea vabastama. (Vaata ka: Täieliku nulli mõistmine) 2.lock ei suuda stringitüüpi lukustada, kuigi see on ka viitetüüp. Sest stringitüüp on CLR-i poolt "hõljutud" See tähendab, et kogu programmis on iga stringi eksemplar ning sama objekt esindab seda teksti kõigis töötavate rakendusdomeenide lõimedes. Seega, kui lukustus paigutatakse sama sisuga stringile ükskõik millises rakendusprotsessis, on kõik selle stringi eksemplarid rakenduses lukustatud. Seetõttu on parim lukustada privaatsed või kaitstud liikmed, keda ei jätkata. 3.locklock objekt on programmiploki mälupiir 4. Väärtuse tüüpi ei saa lukustada, sest eelnevas tekstis on "objekt vabastatud" punasena ning väärtustüüp ei ole viitetüüp 5.lock väldib avalike tüüpide või objektide lukustamist, mida programm ei kontrolli. Näiteks, kui eksemplar on avalikult kättesaadav, võib lock(see) olla problemaatiline, sest kontrollimata kood võib samuti objekti lukustada. See võib viia ummikseisudeni, kus kaks või enam lõime ootavad sama objekti vabastamist. Avalike andmetüüpide lukustamine (erinevalt objektidest) võib samuti põhjustada probleeme samal põhjusel. lock(this) kasutamisel võib klassiliikme muutuja väärtust muuta meetodiga, mis ei ole kriitilises tsoonis.
Rakendusstsenaarium: Seda kasutatakse sageli selleks, et vältida ebakindlaid erandeid avalike muutujate väärtuses, mis on põhjustatud mitmelõimeliste operatsioonide tõttu, et tagada operatsioonide turvalisus
|