Es wird "Thread-sicher" gemacht, indem alle Methoden synchronisiert werden (über das synchronisierte Schlüsselwort), siehe OpenJDK-Quellcode .
Was das synchronisierte Schlüsselwort bewirkt, ist, dass es verhindert, dass mehr als ein Thread gleichzeitig eine der synchronisierten Methoden 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 hilfreich ist, da es zwar einen inkonsistenten internen Zustand des Vektors verhindert, dies jedoch keinesfalls 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 in Ihrem Anwendungscode verwenden müssen (damit Sie genauso gut die unsynchronisierte ArrayList verwenden könnten):
%Vor% Vector
wird als Thread-sicher angesehen, 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 von Vector
und Zugriff auf diese interne Struktur nicht gleichzeitig von separaten Threads verarbeitet werden können.
Die Methoden sind als synchronized
gekennzeichnet. Sehen Sie sich das Tutorial zur synchronisierten Methode an.
Hier finden Sie die folgenden Auszüge aus java api
Erstens ist es nicht möglich, dass zwei Aufrufe von synchronisierten 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 fertig ist.
Zweitens, wenn eine synchronisierte Methode beendet wird, stellt sie automatisch eine "happen-before" -Beziehung mit jedem nachfolgenden Aufruf einer synchronisierten Methode für dasselbe Objekt her. Dies garantiert, dass Änderungen am Status des Objekts für alle Threads sichtbar sind.
Tags und Links java synchronization vector