Sie müssen Java's Vector-Typ der Threadsicherheit wirklich klassifizieren. Javas Vector kann sicher aus mehreren Threads verwendet werden, da es die Synchronisierung der Methoden verwendet. Der Status wird nicht beschädigt.
Die Verwendbarkeit des Java-Vektors ist jedoch von mehreren Threads ohne zusätzliche Synchronisation beschränkt. Betrachten wir zum Beispiel die einfache Akt der ein Element aus einem Vektor
Vector vector = getVector();
if (vector.size() > 0) {
object first = vector.get(0);
}
Diese Methode wird nicht der Staat korrupt des Vektors, aber es ist auch nicht richtig zu lesen. Es gibt nichts, was einen anderen Thread davon abhält, den Vektor zwischen der if-Anweisung und dem Aufruf get() zu mutieren. Dieser Code kann und wird schließlich wegen einer Race-Bedingung fehlschlagen.
Diese Art der Synchronisation ist nur in einer handvoll Szenarien nützlich und es ist sicherlich nicht billig. Sie zahlen einen bemerkenswerten Preis für die Synchronisierung, auch wenn Sie nicht mehrere Threads verwenden.
.Net hat diesen Preis nicht standardmäßig für ein Szenario mit nur begrenzter Verwendbarkeit gewählt. Stattdessen entschied er sich, eine lockfreie Liste zu implementieren. Autoren sind dafür verantwortlich, eine Synchronisierung hinzuzufügen. Es ist näher an C++ - Modell von "nur für das, was Sie verwenden"
Ich schrieb vor kurzem ein paar Artikel über die Gefahren der Verwendung von Sammlungen mit nur interner Synchronisation wie Java-Vektor.
Referenz Vector Thread-Sicherheit: http://www.ibm.com/developerworks/java/library/j-jtp09263.html
Nach MSDN verwenden [Array] (http://msdn.microsoft.com/en-us/library/system.collections. arraylist.aspx # threadSafetyToggle) und [List (Of T)] (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx#threadSafetyToggle) haben dieselbe Threadsicherheit. 'ArrayList' bietet jedoch den Wrapper [Synchronized] (http://msdn.microsoft.com/en-us/library/system.collections.arraylist.synchronized.aspx). –