2013-08-27 12 views
8

Wie stellt Java intern sicher, dass pro JVM nur eine Instanz eines ENUM existiert? Wird es erstellt, wenn die Anwendung hochfährt und ab diesem Zeitpunkt, wenn mehrere Threads darauf zugreifen, wird nur das beim Start erstellte Objekt zurückgegeben.
Oder implementiert es eine Art von Doppelsynchronisation ähnlich dem Singleton-Muster, so dass, auch wenn mehrere Threads darauf zugreifen, nur eine Einheit erstellt wird?Wie Java nur eine Instanz einer Enum pro JVM sichert

+1

Es stellt eine Instanz pro Klassenlader sicher. Wenn Sie über mehrere Klassenlader verfügen, kann jeder eigene Instanzen haben. Sie werden auf Anfrage erstellt. (Lazy-loaded) Die JVM hat hierfür ein eigenes Mutex-Lock. –

Antwort

6

Wie Sie in this answer lesen können enum-Instanzen sind statische Klassenfelder und werden daher als Teil des Klassenladens beim ersten Zugriff auf die Klasse initialisiert.

classloading is synchronized internally so ist sichergestellt, dass Enum Instanzen Singletons sind (Singletons im gleichen Klassenlader, dh. Wenn Sie die gleiche ENUM haben von mehreren Ladern geladen Sie mehrere Instanzen erhalten)

+0

Danke. Gilt das auch für normale statische Variablen? d. h. eine statische Variable läuft Gefahr, mehrfach von mehreren Klassenladern initialisiert zu werden? – Victor

+1

@Victor - ja. Sie werden es nicht als einfache alte Java-Programme sehen, aber es ist ein häufiges Problem mit komplexeren Systemen wie j2ee, wo Sie mehrere Klassen-Loader haben. – radai

+0

@Victor Static-Initialisierungen werden im Kontext eines Classloaders durchgeführt. Im Fall von mehreren Klassenloadern (isoliert, zum Beispiel in J2EE), werden sie mehrmals geladen, solange diese Klassenloader isoliert sind und nicht auf irgendeiner Ebene ihrer Hierarchie konvergieren, wo die Klasse geladen sein könnte (seit eine Last anzufordern, würde bedeuten, etwas im Cache eines gemeinsamen Eltern-Classloaders zurückzugeben). – Gamb

2

Enum-Instanzen werden in Klasse Ladezeit erstellt . Wenn dieselbe Aufzählung von mehr als einem Klassenlader geladen wird (wenn beim Laden von Klassen beispielsweise ein Web-App-Container abgespielt wird), befinden sich mehrere nicht kompatible Instanzen im Speicher.

+0

was meinst du mit 'inkompatible Instanzen'? – apersiankite

Verwandte Themen