2015-01-12 4 views
6

doppelt geprüft Verriegelung brechen Ich weiß, dass doppelte Kontrolle Verriegelung ohne volatile Variable nicht sicher ist, basierend auf diesem Link http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.htmlWie ohne flüchtige

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

ich diese Situation auf meinem Computer zu Hause simulieren will. Ich habe Standard jdk1.7 und Multicore-Prozessor. Aber ich kann das gebrochene Verhalten nicht simulieren. Ich verwende diesen Test http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckTest.java, der dies simulieren sollte. Ich erstelle auch einige meiner Tests, aber ohne Erfolg. Haben Sie eine Idee, wie Sie die Situation simulieren können, wenn dieses Doppelprüfungs-Idiom ohne Volatilität gebrochen ist? So gibt es teilweise erstellte Helper-Klasse zurück.

+3

Das Problem ist, dass Sie wahrscheinlich gegen einen x86-Prozessor laufen. Soweit ich weiß, geben sie nach der Objektkonstruktion eine StoreLoad-Barriere aus, so dass Sie in diesem Fall kein teilweise konstruiertes Objekt sehen. Wenn Sie ein Sparc oder ein anderes System, das die Konstruktion anders behandelt, erhalten, würden Sie wahrscheinlich in der Lage sein, das Problem zu sehen. –

Antwort

Verwandte Themen