In diesem Artikel wird hauptsächlich die Thread-Sicherheit verschiedener Java-Sammlungen ausführlich vorgestellt. Der Herausgeber findet ihn recht gut, daher teile ich ihn hier als Referenz für Freunde, die ihn benötigen.
Thread-Sicherheit
Zunächst müssen Sie verstehen, wie Threads funktionieren. Der JVM hat einen Hauptspeicher und jeder Thread hat seinen eigenen Arbeitsspeicher
Speicher: Wenn ein Thread eine Variable bearbeitet, muss er eine Kopie in seinem eigenen Arbeitsspeicher
erstellen und diese dann in den Hauptspeicher
Der Schlüssel zur Verwendung von Synchronized besteht darin, einen Monitor zu erstellen, der die zu ändernde Variable oder andere Objekte sein kann, die Ihrer Meinung nach geeignet sind, z. B. Methoden, und den Monitor dann zu sperren, um Thread-Sicherheit zu erreichen Nachdem jeder Thread diese Sperre erhalten hat, muss er den Vorgang zum Laden in den Arbeitsspeicher -> Dadurch wird die sogenannte Thread-Sicherheit erreicht.
Was ist Thread-Sicherheit? Wie wird Thread-Sicherheit erreicht (Prinzip)? Beim Schreiben von Thread-sicherem Code ist die Thread-Synchronisierung gering.
Java-bezogene Sammlungen
Vektor, ArrayList, LinkedList
Vektor und ArrayList Sie sind in der Verwendung sehr ähnlich und können zur Darstellung einer Menge variabler Objektanwendungen verwendet werden, und auf die Elemente kann zufällig zugegriffen werden.
Die Methoden von Vector sind alle synchronisiert (Synchronized) und Thread-sicher (Thread-sicher), die Methoden von ArrayList jedoch nicht, da die Thread-Synchronisierung zwangsläufig die Leistung beeinträchtigt ArrayList Besser als Vector.
Der Unterschied zwischen ArrayList und LinkedList
Für die Verarbeitung einer Liste von Datenelementen stellt Java zwei Klassen bereit: ArrayList und LinkedList Die interne Implementierung ArrayList basiert auf dem internen Array Object[], daher ähnelt es konzeptionell eher einem Array, aber die interne Implementierung von LinkedList basiert auf einer Reihe verbundener Datensätze, sodass es eher einer verknüpften Listenstruktur ähnelt. Es gibt also eine großer Leistungsunterschied zwischen ihnen.
Aus der obigen Analyse können wir ersehen, dass Sie beim Einfügen von Daten vor oder in der Mitte von ArrayList alle nachfolgenden Daten entsprechend nach hinten verschieben müssen, was zwangsläufig mehr Zeit in Anspruch nimmt Der Vorgang besteht darin, Daten nach einer Datenspalte statt in der Vorder- oder Mittelspalte hinzuzufügen. Wenn Sie zufällig auf die Elemente zugreifen müssen, bietet die Verwendung von ArrayList eine bessere Leistung
Und beim Zugriff auf ein bestimmtes Element Wenn in der verknüpften Liste Elemente vorhanden sind, müssen Sie an einem Ende der verknüpften Liste beginnen und Element für Element entlang der Verbindungsrichtung suchen, bis Sie das erforderliche Element gefunden haben. Wenn Sie also Daten vorne oder hinten hinzufügen oder löschen möchten in der Mitte einer Datenspalte. Wenn Sie der Reihe nach auf die Elemente zugreifen, sollten Sie LinkedList verwenden.
Wenn in der Programmierung die beiden Situationen 1 und 2 abwechselnd auftreten, können Sie die Verwendung einer allgemeinen Schnittstelle wie List in Betracht ziehen, ohne sich um die spezifische Implementierung zu kümmern. In bestimmten Situationen wird die Leistung durch die spezifische gewährleistet Durchführung.
HashTable, HashMap, HashSet
HashTable und HashMap verwenden denselben Speichermechanismus und ihre Implementierung ist grundsätzlich gleich. Der Unterschied ist:
1), HashMap ist nicht threadsicher, HashTable ist threadsicher und die internen Methoden sind grundsätzlich synchronisiert.
2), HashTable lässt keine Nullwerte zu.
Wenn beim Aufruf der Put-Methode in der HashTable der Schlüssel null ist, wird direkt eine NullPointerException ausgelöst. Es gibt andere subtile Unterschiede, wie z. B. die Größe des initialisierten Entry-Arrays usw., aber die Grundidee ist dieselbe wie bei HashMap.
HashSet:
1 HashSet wird basierend auf HashMap implementiert und hat keine Kapazitätsbeschränkung.
2. HashSet ist nicht threadsicher.
3. HashSet garantiert keine Bestellung.
HashMap:
1. HashMap verwendet ein Array zum Speichern des Eintragsobjekts, das aus Schlüssel und Wert besteht, ohne Kapazitätsbeschränkung.
2. HashMap findet den Speicherort des Eintragsobjekts im Array basierend auf dem Schlüssel-Hash und verwendet eine verknüpfte Liste, um Hash-Konflikte zu lösen.
3. Beim Einfügen von Elementen muss HashMap möglicherweise die Kapazität des Arrays erweitern. Beim Erweitern der Kapazität muss der Hash neu berechnet und das Objekt in ein neues Array kopiert werden.
4. HashMap ist nicht threadsicher.
5. HashMap-Traversal verwendet Iterator
HashTable
1. HashTable ist threadsicher.
2. Weder Schlüssel noch Wert in HashTable dürfen null sein.
3. HashTable-Traversal verwendet Enumeration.
TreeSet,TreeMap
TreeSet:
1. TreeSet wird basierend auf TreeMap implementiert und unterstützt die Sortierung.
2. TreeSet ist nicht threadsicher.
Der Beschreibung von HashSet und TreeSet nach zu urteilen, basiert TreeSet wie HashSet vollständig auf Map und unterstützt weder get(int), um das Element an der angegebenen Position abzurufen (außerdem muss TreeSet durchlaufen werden). Bietet außerdem einige Sortierunterstützung wurde hinzugefügt. Übergeben Sie beispielsweise die Comparator-Implementierung, descendingSet, descendingIterator usw.
TreeMap:
1. TreeMap ist eine typische Kartenimplementierung, die auf Rot-Schwarz-Bäumen basiert, daher ist auch die Schlüsselvergleichsmethode erforderlich übergeben Sie die Comparator-Implementierung, oder das Schlüsselobjekt implementiert die Comparable-Schnittstelle.
2. TreeMap ist nicht threadsicher.
Zusammenfassung
Das obige ist der detaillierte Inhalt vonThread-Sicherheitsanalyse verschiedener Sammlungen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!