Synchronisation in Vektoren in Java

7

Was mit Vektor in Java gemeint ist, ist threadsicher und synchronisiert, wie wird es threadsicher gemacht. Ich schaue auf interne Details der Implementierung

    
emkrish 27.01.2010, 05:57
quelle

4 Antworten

16

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%     
Thilo 27.01.2010 06:08
quelle
4

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.

    
akf 27.01.2010 06:08
quelle
0

Die Methoden sind als synchronized gekennzeichnet. Sehen Sie sich das Tutorial zur synchronisierten Methode an.

    
notnoop 27.01.2010 06:04
quelle
0

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.

    
user1643635 05.10.2012 10:10
quelle

Tags und Links