|
Cuvântul cheie lock marchează un bloc de instrucțiuni ca zonă critică prin luarea unui mutex pentru un obiect dat, executarea instrucțiunii și apoi eliberarea blocării.
Instrucțiunea lock folosește practic Monitor.Enter și Monitor.Exit, adică Monitor.Enter(this) este executat când lock(this) este executat, iar Monitor.Exit (this) este executat la capătul bracket-ului curly. Care este sensul său, pentru orice obiect, prima parte a memoriei este adresa tuturor metodelor, iar a doua parte este un index. El indică un SyncBlock în zona SyncBlock Cache a CLR-ului. Ce înseamnă asta? Adică, când execuți Monitor.Enter(Object), dacă valoarea indexului obiectului este negativă, selectează un SyncBlock din Cache-ul SyncBlock și plasează adresa acestuia în indexul obiectului. Aceasta finalizează blocarea marcată de obiect, iar celelalte fire vor să execute din nou operația Monitor.Enter(obiect), care va obține un index cu un obiect pozitiv, apoi vor aștepta. Până când indexul devine negativ, adică firul folosește Monitor.Exit(obiect) pentru a transforma indexul în negativ. La ce trebuie să fii atent când folosești lacăt:
1.lock nu poate bloca valoarea nulă Un obiect poate indica valoarea nulă, dar nulul nu trebuie eliberat. (Vezi și: Înțelegerea Nulului complet) 2.lock nu poate bloca tipul de șir, deși este și un tip de referință. Pentru că tipul de șir este "hoverat" de CLR Aceasta înseamnă că există o singură instanță a fiecărui șir dat în întregul program, iar același obiect reprezintă acel text în toate firele de execuție ale tuturor domeniilor de aplicație care rulează. Prin urmare, atâta timp cât un blocaj este plasat pe un șir cu același conținut oriunde în procesul aplicației, toate instanțele acelui șiraj din aplicație vor fi blocate. Prin urmare, este mai bine să blochezi membri privați sau protejați care nu vor fi insistați. 3. blocare Obiectul este granița memoriei unui bloc de program 4. Tipul de valoare nu poate fi blocat, deoarece "obiectul este eliberat" cu roșu în textul anterior, iar tipul de valoare nu este un tip de referință 5.lock evită blocarea tipurilor publice sau a obiectelor care nu sunt controlate de program. De exemplu, dacă instanța este accesibilă publicului, blocarea (aceasta) poate fi problematică deoarece codul necontrolat poate bloca și obiectul. Acest lucru poate duce la blocaje, unde două sau mai multe fire de execuție așteaptă să elibereze același obiect. Blocarea tipurilor de date publice (spre deosebire de obiecte) poate cauza probleme din același motiv. Când se folosește lock(this), valoarea variabilei membre de clasă poate fi modificată de metoda care nu se află în zona critică
Scenariu de aplicare: Este adesea folosit pentru a preveni excepțiile incerte în valoarea variabilelor publice cauzate de operațiuni multi-threaded, pentru a asigura securitatea operațiunilor
|