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
Antwort
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)
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
@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
@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
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.
was meinst du mit 'inkompatible Instanzen'? – apersiankite
- 1. eine Instanz der App pro Computer, wie?
- 2. Warum ändert nur eine Aggregat-Instanz pro Transaktion?
- 3. Lokale Instanz einer Base Enum oder Passing Enum Collection?
- 4. Eine Methode nur aus einer Instanz entfernen
- 5. Wie sichert man am besten eine Datenbankverbindungszeichenfolge?
- 6. Erhalten Namen Enum-Instanz
- 7. Wie sichert man eine Solr-Datenbank?
- 8. Get Enum-Instanz
- 9. Wie man eine django db sichert
- 10. Sind Definitionen in einer Swift-Klasse nur einmal oder pro Instanz zugeordnet?
- 11. Wie Typ Typ für enum Instanz Basisklasse?
- 12. Wie durchlaufe ich eine Enum in Java?
- 13. Microservices: Datenquelle pro Instanz oder pro Microservice?
- 14. Wie sichert man die PHP-Datei nur für Cron-Aufgaben?
- 15. eine statische Methode einer Klasse mit nur einer Instanz aufrufen
- 16. Erhalte nur Eigenschaften einer Instanz
- 17. Wie kann man nur eine Instanz eines Java-Programms gleichzeitig ausführen?
- 18. Java benutzerdefinierte Enum-Wert ENUM
- 19. Ist ServletContext eins pro Web-App oder eins pro JVM?
- 20. Wie kann ich eine Instanz von Enum zurückgeben?
- 21. Java - gibt es eine "Unterklasse" wie Instanz?
- 22. Java Android: Wie erzwinge nur eine Instanz einer App (SingleTop nicht richtig funktioniert)?
- 23. Wie viele JVM können wir in einer Maschine haben?
- 24. Einschränken des Android-Widgets auf eine Instanz pro Gerät
- 25. Was ist die JVM-Initialisierungsreihenfolge für eine Klasse hat eine Instanz einer anderen Klasse
- 26. Eine Auflistung aller derzeit geladenen Klassen in einer bestimmten JVM-Instanz abrufen
- 27. Wie sichert man eine riesige Datei mit Bacula?
- 28. Eine Instanz einer Java-Klasse in eine XML-Datei übertragen
- 29. Java-kovariante Rückgabetypen funktionieren nicht für das Überschreiben von Methoden einer enum-Instanz?
- 30. Java-enum Stilklassen in Objective-C?
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. –