Warum vector in Java muss synchronisiert werden?
Ich versuche zu verstehen, warum vector in Java synchronisiert werden. Wo kam ich durch google, Sie sagte, dass Ihr synchronisiert, weil seine Elemente werden synchronisiert blockiert andere threads zugreifen, wenn ein thread darauf zugreift. Aber was ich eigentlich wissen will ist warum muss es sein? Java sollte überlassen es den Menschen, die auf es zu. Aber warum Java gezwungen alle Menschen Zugriff auf vector zu verwenden, eine synchronisierte Datenstruktur? Ich Stimme mit Menschen, die sagt, dass die ArrayList kann verwendet werden, für meine Anforderung. Aber mein Punkt ist, was ist, dass Vektor zu mir??
Dank und Grüße,
Rengasami Ramanujam
- Vektor stammt aus JDK 1.0 (1996), großflächige Parallelität war nicht so sehr ein Problem damals.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geschichte.
Vector
war Teil des JDK 1.0;ArrayList
war es nicht. Wir haben gelernt, dass die Synchronisierung als Standard bedeutete eine schlechte Leistung, so war es Umgekehrt, wenn die Java Collections API kam.Können Sie immer noch entscheiden, synchronisieren, jede Kollektion, die Sie brauchen, um sich mit den Methoden
java.util.Collections
, aber es ist Ihre Wahl.Sollten Sie auch bewusst sein, dass die Sammlungen, die Teil der
java.util.concurrent
Pakete. Der gleichzeitige Zugriff von Sammlungen sicherlich muss sorgfältig choreographiert werden.Vector
ist fast nie das, was Sie wollen eh. im Grunde genommen kein moderner code sollteVector
.Ist es eine "legacy" - Klasse.
Es sei denn, Sie benötigen insbesondere eine synchronisierte Liste Klasse
Vector
gibt Ihnen nichts, wenn Sie neuen code schreiben.Jedoch
Vector
ist (immer noch) es für einen guten Grund. Grund dafür ist, Ihnen zu erlauben, führen Sie alten Java-code, der geschrieben wurde, um die Arbeit mit Java 1.0 und Java 1.1, oder auf einige Java-ME-profile, die nicht über das Java collections framework. Und es hat (noch) synchronisiert werden, da, wenn Sie es geändert, dass jedes multi-threaded legacy-code, der verwendetVector
brechen könnte.Beachten Sie in diesem Beispiel, dass zeigt, dass Sie noch brauchen, um die Synchronisierung zu verwenden Sie in Ihrer Anwendung code.
Warum Vector ? hängt davon ab, was Sie tun
Intern, sowohl die ArrayList und Vector halten Sie auf Ihre Inhalte mit einem Array. Sie müssen halten Sie diese Tatsache im Hinterkopf, während mit entweder in Ihren Programmen. Beim einfügen eines Elements in eine ArrayList oder einen Vector, das Objekt wird müssen, erweitern Sie Ihre interne array-wenn es läuft aus dem Zimmer. Ein Vektor wird standardmäßig auf die Verdoppelung der Größe des Arrays, während die ArrayList erhöht seine array-Größe um 50 Prozent. Je nachdem, wie Sie diese Klassen verwenden, könnten Sie am Ende einen großen Leistungseinbruch beim hinzufügen von neuen Elementen. Es ist immer am besten, das Objekt der anfänglichen Kapazität, um die größte Kapazität, die in Ihrem Programm benötigen. Durch die sorgfältige Einstellung der Kapazität, können Sie vermeiden, die Zahlung der Strafe Bedarf, um die Größe des internen Arrays später. Wenn Sie nicht wissen, wie viele Daten Sie haben, aber Sie wissen, die rate, an dem es wächst, Vektor besitzt einen leichten Vorteil, denn Sie können den Wert erhöhen.
Sind Sie nicht gezwungen, eine
Vector
Sie sind in Ordnung zu verwendenArrayList
s auch.Wenn Sie die Arbeit mit threads, Sie sind glücklich, wenn Ihr synchronisiert. Wenn Ihre Anwendung nicht verwenden threading würde ich etwas schneller als ein
Vector
.Machen Vector synchronisiert ist nur die Art, wie die Leute, die schreiben, dass Java-Bibliothek beschlossen, es zu implementieren. Beide ArrayList und Vector implementiert werden intern als arrays, beide sind dynamisch geändert werden, aber ein Vektor ist eine
capacityIncrement
der das doppelte des aktuellen array-Größe, wo für den ArrayList-es ist die Hälfte der aktuellen Größe. Vector ist langsamer als Sie haben zu prüfen, ist jede andere threads zugreifen, bevor es ein anderer thread ist.Wenn Sie eine synchronisierte Liste-Daten-Struktur ist es am besten zu verwenden
synchronizedList(List list)
von der Collections-API.Wenn Sie möchten, synchronisieren Sie die gesamte Sequenz von Operationen, die Verwendung einer arrayList.
Die Synchronisierung der einzelnen Betreiber als Vektor macht, ist weniger sicher.
Wenn es keine Notwendigkeit für thread-sichere Operationen, ist es empfehlenswert, tu mit ArrayLists.