Wenn ich statische Klasse habe, wie garantiert jvm, dass es einmal initialisiert wird? Was passiert, wenn zwei Threads gleichzeitig versuchen, auf dieses erste Mal zuzugreifen? Ist diese Eigenschaft invariant? EDIT: Es handelt sich um eine Klasse, die statische Variablen hat.Wie funktioniert Static in einer Umgebung mit mehreren Threads?
Antwort
Die JVM garantiert, dass jede Klasse genau einmal initialisiert wird.
Was genau Low-Level-Mechanismus verwendet wird, ist wirklich JVM-spezifisch, aber die Sache, die Sie als Programmierer wissen müssen, ist, dass es thread-safe per se versucht, auf die gleiche Klasse zuzugreifen/zu initialisieren verschiedene Themen. (Natürlich gilt das nur für das Laden von Klassen: im Hinblick auf den Zugriff auf unveränderliche Daten, sei es statisch oder einer bestimmten Instanz, müssen Sie geeignete Maßnahmen ergreifen.)
Sie können eine statische geschachtelte Klasse haben und sich wie jede andere Klasse verhalten.
Ich nehme an, Sie beziehen sich auf statische Code/Blöcke und Klasseninitialisierung. Die JVM garantiert, dass eine Klasse nur von einem Thread geladen wird. Seit seiner Einbettung in die JVM stelle ich mir nicht vor, dass irgendwelche Sprachen es nicht benutzen würden.
Zunächst einmal ist das statische Schlüsselwort nicht so häufig in Klassendeklarationen verwendet, obwohl es dort verwendet werden kann, bedeutet aber etwas anderes als für Variablen oder Methoden.
Wollten Sie wirklich über statische Klassen wissen? Oder war es eine Frage über statische Variablen/Methoden?
Statisch wird alles initialisiert, wenn die Klasse geladen wird, nicht wenn der erste Thread versucht, darauf zuzugreifen. static
für eine Klasse ist jedoch nicht identisch mit static
für ein Datenelement oder eine Funktion/Methode. Weitere Informationen hierzu finden Sie unter this article. Wenn Sie nach Datenmembern fragen, wenn sie statisch sind, werden sie als "Klassenvariablen" oder "Klassenmethoden" und nicht als "Objektvariablen" betrachtet (siehe this article from Oracle for that discussion). Dies wird dadurch erreicht, dass sie Teil des Klassenobjekts selbst und nicht der Instanzen werden. Es gibt immer nur ein Klassenobjekt für eine bestimmte Klasse.
In Bezug auf Ihre Frage zu anderen Sprachen: nein, statisch kann je nach Sprache viele verschiedene Dinge bedeuten.
- 1. ffmpeg hängt, wenn in einer Umgebung mit mehreren Threads
- 2. Irgendwelche Probleme mit statischen inneren Klassen in einer Umgebung mit mehreren Threads?
- 3. Suche nach einer Datei mit mehreren Threads
- 4. Wie funktioniert Malloc in einer Multithread-Umgebung?
- 5. C global static - unter Threads geteilt?
- 6. WPF und Datenbindung in einer ADO.NET App mit mehreren Threads
- 7. Loops in mehreren Threads
- 8. Umgebung mit mehreren Python-Interpreter
- 9. Web Parser mit mehreren Threads
- 10. Java-Einzelprozess mit mehreren Threads
- 11. Lange laufende Operationen (Threads) in einer Web (asp.net) Umgebung
- 12. beste Möglichkeit, Threads in einer Java-Umgebung zu töten?
- 13. Jmeter Zufallsvariable in mehreren Threads
- 14. Android: OpenGL in mehreren Threads
- 15. Wie verarbeitet man Daten in mehreren Threads mit EJB3?
- 16. Wie funktioniert die Interaktion mit Threads?
- 17. Verwenden von libcurl erfolglos mit mehreren Threads
- 18. Verzögerte Entwertung von etwas in mehreren Threads
- 19. Lesen aus einer SQS-Warteschlange mit mehreren Threads
- 20. Ausführen von mehreren Threads
- 21. Perl: Build komplexer Objektbaum mit mehreren Threads
- 22. Zugriff auf komplexe Objekte in mehreren Threads mit PHP Pthreads
- 23. Wie funktioniert Rubin Juwel in einer Schiene Umgebung
- 24. Engpass bei der Zufallsgenerierung mit mehreren Threads
- 25. Signalverarbeitung mit mehreren Threads unter Linux
- 26. Aufruf accept() von mehreren Threads
- 27. Console.WriteLine aus mehreren Threads aufrufen
- 28. Was macht sys.exit wirklich mit mehreren Threads?
- 29. Zeichnen von mehreren Threads in Qt
- 30. Handhabung Zustand in einer Instanz, die von mehreren Threads
Können Sie eine Klasse laden, ohne einen Thread zu verwenden? –
Ich bin mir nicht sicher, ob ich deine Frage vollständig verstanden habe. Üblicherweise wird das Laden von Klassen von der JVM übernommen, Sie können jedoch Klassen explizit mit der 'Class.forName()' Methode laden. Unweigerlich muss ein Thread das Laden durchführen, aber Sie müssen nicht explizit ein 'new Thread()' -Objekt deklarieren, um eine Klasse zu laden. –