Interlock a verificat din nou

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Interblocarea cu verificare dublă sau Blocarea cu verificare dublă este unul dintre cele mai subtile modele de programare simultană , în principal în Java . La prima vedere pare un instrument util pentru îmbunătățirea performanței, totuși această schemă nu funcționa înainte de introducerea actualului JavaMemoryModel [1] .

Exemplu

 clasă publică DoubleCheckedLocking {
    resursă statică privată _instanță ;
    public static Resurse getInstance () {
        if ( _instance == nul ) {
            sincronizate (DoubleCheckedLocking. class) {
                if ( _instance == nul ) {
                    _instanță = resursă nouă ();
                }
            }
        }
        întoarcere _instanță ;
    }
}

Inițializarea unui obiect implică scrierea unor variabile (starea obiectului), publicarea unui obiect implică scrierea altor variabile ( referința ). Dacă nu vă asigurați că inițializarea unui obiect are loc înainte ca un fir să poată citi referința acestuia, scrierea referinței poate fi reordonată cu starea obiectului.

În acest caz, un fir poate vedea o valoare actualizată pentru referință, dar o valoare învechită pentru unele dintre variabilele care alcătuiesc starea obiectului. Se obține apoi referința la un obiect parțial construit.

Fără a utiliza tehnici prea elaborate și adesea inutile, este posibil să se rezolve problema cu următorul cod:

 public class EagerInstantiation {
    private static final Resurse _instanță = resursă nouă ();
    public static Resource getResource () {
        întoarcere _instanță ; // :-)
    }
}

O alternativă este utilizarea unei variabile booleene care menține starea de inițializare a instanței singleton . Acest lucru împiedică firele simultane să obțină o referință de instanță înainte ca constructorul obiectului să se termine și să facă obiectul consecvent:

 clasă publică DoubleCheckedLocking {
    resursă statică privată _instanță ;
    privat static boolean inițializat = fals ;
    public static Resurse getInstance () {
        if ( ! initializat ) {
            sincronizate (DoubleCheckedLocking. class) {
                if ( ! initializat ) {
                    _instanță = resursă nouă ();
                    initializat = adevarat ;
                }
            }
        }
        întoarcere _instanță ;
    }
}

Momentul în care apare instrucțiunea de atribuire a variabilei booleene asigură faptul că constructorul a terminat inițializarea obiectului. Chiar și în scenariul în care firul care a inițiat construcția obiectului nu a ieșit încă din secțiunea critică, orice alt fir concurent care nu reușește primul test în afara secțiunii critice va returna direct (fără a aștepta pe mutex ) obiectul inițializat cu succes.

Această soluție la problemă, prin urmare, se bazează pe ideea de a nu testa direct referința la obiect, ci o variabilă distinctă care a fost stabilită după construirea obiectului.

Notă

  1. ^ Declarația „Blocarea verificată dublu este ruptă” , la www.cs.umd.edu . Accesat la 25 octombrie 2016 .

Bibliografie

  • Reality Check , Douglas C. Schmidt, C ++ Report, SIGS, Vol. 8, No. 3, martie 1996.
  • Blocare dublă verificată: un model de optimizare pentru inițializarea și accesarea eficientă a obiectelor sigure la fire , Douglas Schmidt și Tim Harrison. Cea de-a treia conferință anuală a modelului Limbaje de proiectare a programului, 1996
  • Instanță leneșă , Philip Bishop și Nigel Warren, Revista JavaWorld
  • Programarea firelor Java în lumea reală , Partea 7, Allen Holub, Javaworld Magazine, aprilie 1999.
  • Java 2 Performance and Idiom Guide , Craig Larman și Rhett Guthrie, p100.
  • Java în practică: stiluri și moduri de proiectare pentru Java eficient , Nigel Warren și Philip Bishop, p142.
  • Regula 99, Elementele stilului Java , Allan Vermeulen, Scott Ambler, Greg Bumgardner, Eldon Metz, Trvor Misfeldt, Jim Shur, Patrick Thompson, Biblioteca de referință SIGS

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT