2015-01-12 13 views
6

so che doppia chiusura assegno senza variabile volatile non è sicuro in base a questo link http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.htmlCome rompere bloccaggio ricontrollato senza volatili

class Foo { 
    private Helper helper = null; 
    public Helper getHelper() { 
     if (helper == null) { 
      synchronized(this) { 
       if (helper == null) { 
        helper = new Helper(); 
       } 
      } 
     } 
     return helper; 
    } 
} 

voglio simulare questa situazione a mio computer di casa. Ho standard jdk1.7 e processore multicore. Ma non sono in grado di simulare il comportamento rotto. Sto usando questo test http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckTest.java che dovrebbe simulare questo. Creo anche alcuni dei miei test, ma senza successo. Hai qualche idea su come simulare la situazione quando si rompe questo idioma a doppio controllo senza volatile? Quindi restituisce classe Helper parzialmente creata.

+3

Il problema è che si sta probabilmente utilizzando un processore x86. Da quello che so rilasciano una barriera StoreLoad dopo la costruzione dell'oggetto quindi in tal caso non vedrai un oggetto parzialmente costruito. Se riesci a ottenere uno sparc o un altro sistema che gestisce la costruzione in modo diverso, probabilmente sarai in grado di vedere il problema. –

risposta

Problemi correlati