|
Užrakto raktažodis pažymi teiginių bloką kaip kritinę zoną, paimdamas tam tikro objekto muteksą, vykdydamas sakinį ir atleisdamas užraktą.
Užrakto sakinys iš esmės naudoja Monitor.Enter ir Monitor.Exit, tai yra, Monitor.Enter(this) vykdomas, kai vykdomas lock(this), o Monitor.Exit(this) vykdomas garbanotojo skliausto pabaigoje. Ką reiškia bet kuriam objektui, pirmoji atminties dalis yra visų metodų adresas, o antroji dalis yra indeksas. Jis nurodo į "SyncBlock" CLR "SyncBlock" talpyklos srityje. Ką tai reiškia? Tai yra, kai vykdote Monitor.Enter(Object), jei objekto indekso reikšmė yra neigiama, pasirinkite SyncBlock iš SyncBlock talpyklos ir įdėkite jo adresą į objekto indeksą. Tai užbaigia objekto pažymėtą užraktą, o kitos gijos nori dar kartą atlikti operaciją Monitor.Enter(object), kuri gaus indeksą su teigiamu objektu, ir tada palaukti. Kol indeksas tampa neigiamas, t.y. gija naudoja Monitor.Exit(object), kad indeksas taptų neigiamas. Į ką reikia atkreipti dėmesį naudojant užraktą:
1.Lock negali užrakinti nulinės reikšmės Objektas gali nurodyti nulį, bet nulinio nereikia atleisti. (Taip pat žr.: Visiško nulio supratimas) 2.Lock negali užrakinti eilutės tipo, nors jis taip pat yra nuorodos tipas. Kadangi eilutės tipą CLR "užveda" Tai reiškia, kad visoje programoje yra tik vienas bet kurios eilutės egzempliorius, ir tas pats objektas atspindi tą tekstą visose veikiančių programų domenų gijose. Todėl, kol užraktas uždedamas ant eilutės su tuo pačiu turiniu bet kurioje programos proceso vietoje, visi tos eilutės egzemplioriai programoje bus užrakinti. Todėl geriausia užrakinti privačius ar apsaugotus narius, kurie nebus išlikę. 3.Locklock objektas yra programos bloko atminties riba 4. Vertės tipo užrakinti negalima, nes ankstesniame tekste raudonai pažymėtas "objektas išleistas", o reikšmės tipas nėra nuorodos tipas 5.Užraktas leidžia išvengti viešųjų tipų ar objektų, kurių programa nekontroliuoja, užrakinimo. Pavyzdžiui, jei egzempliorius yra viešai prieinamas, lock(this) gali būti problematiškas, nes nekontroliuojamas kodas taip pat gali užrakinti objektą. Tai gali sukelti aklavietę, kai dvi ar daugiau gijų laukia, kol išlaisvins tą patį objektą. Viešųjų duomenų tipų (priešingai nei objektų) užrakinimas taip pat gali sukelti problemų dėl tos pačios priežasties. Naudojant lock(this), klasės nario kintamojo reikšmę galima pakeisti metodu, kuris nėra kritinėje zonoje
Taikymo scenarijus: Jis dažnai naudojamas siekiant išvengti neaiškių viešųjų kintamųjų vertės išimčių, kurias sukelia kelių gijų operacijos, siekiant užtikrinti operacijų saugumą
|