2010-10-19 5 views
5

Wie kann in einer Multithread-Umgebung ein Thread möglicherweise ein "teilweise konstruiertes Objekt" sehen? Ich habe verstanden, dass es nicht Thread-sicher ist, da mehrere Threads mehrere Instanzen erstellen können.Teilweise konstruierte Objekte in nicht threadsicherem Singleton

class LazyInit 
{ private static Resource resource = null; 

    public static getInstance() 
    { if (resource == null) { resource = new Resource(); } 
     return instance; 
    } 
} 
+1

Siehe https://secure.wikimedia.org/wikipedia/de/wiki/Double-checked_locking – Bozho

Antwort

7

Aufgrund der Out-of-Order-Schreibvorgänge.

Wenn Ihr Konstruktor in nicht endgültige Elemente schreibt, müssen sie nicht sofort in den Speicher übergeben werden, und tatsächlich können sie sogar nach der Singleton-Variablen festgeschrieben werden. Java garantiert, dass der Thread, der es betrifft, die Affektiertheit in der Reihenfolge sieht, aber nicht, dass andere Threads dies tun, wenn Sie keine Speicherbarriere setzen.
Weitere Informationen finden Sie unter this question und this page der Java-Spezifikation.

Es könnte neben dem Punkt sein, aber in Ihrem Beispiel ist es durchaus möglich, dass zwei Threads verschiedene Singletons sehen. Angenommen, ein Thread testet die Nichtigkeit der Variablen, gibt if ein und erhält Vorrang, bevor er das Objekt konstruieren kann. Der neue Thread, der die CPU abruft, testet nun das now-null-Objekt und baut das Singleton auf. Wenn der alte Thread erneut gestartet wird, beendet er glücklich das Erstellen des Objekts und überschreibt die Singleton-Variable.
Ein weiteres, beängstigenderes Problem tritt auf, wenn der Konstruktor von Resource eine Methode aufruft, die letztendlich zu einem weiteren Aufruf dieser getInstance führt. Selbst wenn der Status des Programms keine Endlosschleife ergibt, werden Sie mehrere Singleton-Instanzen erstellen.

Verwandte Themen