See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 20027|Vastuse: 0

[Allikas] C# lukustusmärksõna märgib lausete ploki kriitiliseks alaks, saades antud objekti muteksi ja täites lause, kuid...

[Kopeeri link]
Postitatud 31.12.2015 17:51:01 | | |
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









Eelmine:Win8 käivitab SQL Server 2012 teenuse
Järgmine:[Kiirus] IP-segmendi avatud pordi skanner kiireks skaneerimiseks!!
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com