Was mit Vektor in Java gemeint ist, ist threadsicher und synchronisiert, wie wird es threadsicher gemacht. Ich schaue auf interne Details der ImplementierungSynchronisation in Vektoren in Java
Antwort
Die Methoden sind als synchronized
markiert. Schau dir die Synchronized Method tutorial an.
Vector
wird als "Thread-sicher" betrachtet, da der Zugriff auf die Interna des Vectors synchronisiert wird. Methoden wie add()
, get()
, size()
usw. werden alle so synchronisiert, dass Änderungen an der internen Struktur des Vector
und Zugriff auf diese interne Struktur nicht gleichzeitig von separaten Threads verarbeitet werden können.
Es wird "thread-safe" gemacht, indem alle Methoden synchronisiert werden (über das synchronisierte Schlüsselwort), siehe OpenJDK source code.
Durch das synchronisierte Schlüsselwort wird verhindert, dass mehr als ein Thread synchronisierte Methoden gleichzeitig ausführt. Es verwendet intern eine Sperre, die ein Thread beim Eingeben dieser Methoden erhalten muss, und die der Thread freigibt, wenn er die Methode verlässt.
Beachten Sie, dass dies nicht wirklich viel hilft, da es zwar einen inkonsistenten internen Zustand des Vektors verhindert, dies jedoch in keiner Weise eine Konsistenz auf einer höheren Ebene garantiert (eine nützliche Ebene für eine Anwendung).
Betrachten Sie dieses Beispiel, das zeigt, dass Sie immer noch die Synchronisation im Anwendungscode verwenden müssen (so dass Sie könnte genauso gut die unsynchronisierte Arraylist verwendet haben):
// BROKEN CODE, needs external synchronization
// only add an element if the vector is empty
if(vector.isEmpty())
vector.add(anElement);
Bitte finden Sie die folgenden Auszüge aus java api
Erstens ist es nicht möglich, dass zwei Aufrufe synchronisierter Methoden auf dasselbe Objekt verschachtelt werden. Wenn ein Thread eine synchronisierte Methode für ein Objekt ausführt, werden alle anderen Threads aufgerufen, die synchronisierte Methoden für denselben Objektblock aufrufen (Ausführung aussetzen), bis der erste Thread mit dem Objekt ausgeführt wird.
Zweitens, wenn eine synchronisierte Methode beendet wird, stellt sie automatisch eine "happen-before" -Beziehung mit einem nachfolgenden Aufruf einer synchronisierten Methode für dasselbe Objekt her. Dies garantiert, dass Änderungen am Status des Objekts für alle Threads sichtbar sind.
- 1. hashtable und Synchronisation in Java
- 2. Synchronisation in Threads für Java
- 3. Java Synchronisation
- 4. Verwendung von Vektoren in Java
- 5. java threads Synchronisation
- 6. Java-Synchronisation Aufgabe
- 7. Vektoren in einer Grafik in ImageJ (Java)
- 8. Java: Arrays & Vektoren
- 9. Java-Synchronisation im Singleton-Muster
- 10. Synchronisation auf "diesem" oder privaten Objekt in Java?
- 11. Mit Hilfe verschiedene Objekte für eine Synchronisation/lock in Java
- 12. Java anonyme Klassen und Synchronisation und "das"
- 13. Verwirrt über Synchronisation und Thread Safe? java
- 14. Thread-Synchronisation in SQL sicherstellen?
- 15. Synchronisation zwischen Befehlspuffern in Vulkan
- 16. Java-Synchronisation - Warte auf n Threads ankommen
- 17. Wie funktioniert die Synchronisation in StringBuffer?
- 18. Eckige Klammern in Vektoren
- 19. Generate Vektoren in Matlab
- 20. Umstellen Vektoren in Matrix
- 21. Wie Vektoren in R
- 22. Kombination Vektoren in Matlab
- 23. Vektoren in Arduino
- 24. In Vektoren in Netbeans suchen
- 25. Synchronisation, Wann oder nicht?
- 26. Java: Füllt zwei Vektoren und sortiert sie
- 27. Ereignis Dispatching Thread-Synchronisation
- 28. Anfrage-Antwort-Synchronisation/Abgleich in Null Kontext
- 29. Wie zeichne Vektoren (physische 2D/3D-Vektoren) in MATLAB?
- 30. Verwendung von Vektoren von Vektoren in C++ & push_back()
+1, aber Sie sollten korrigieren "Was das synchronisierte Schlüsselwort bewirkt, ist, dass es mehr als einen Thread daran hindert, die Methode zur gleichen Zeit auszuführen". Es ist nicht nur der Zugriff auf die bestimmte Methode, die blockiert ist. – Fredrik
@ Fredrik: Danke. Ich habe versucht, den Satz zu reparieren, ohne dass es zu komplex wurde. Ich nehme an, ein Link zu einer längeren Erklärung wäre in Ordnung. – Thilo
Habe ich es richtig verstanden, dass in dem Code, den Sie zur Verfügung gestellt haben, der "Vektor" vor vector.add (anElement) verändert worden sein könnte (nicht leer); – soshial