Thread-Sicherheit
Zunächst müssen Sie verstehen, wie Threads über einen Hauptspeicher verfügen Jeder Thread hat seinen eigenen Arbeitsspeicher. Wenn ein Thread eine Variable bearbeitet, muss er eine Kopie in seinem eigenen Arbeitsspeicher erstellen und dann main
Speicher. Wenn mehrere Threads gleichzeitig mit derselben Variablen arbeiten, kann es zu unvorhersehbaren Ergebnissen kommen. Basierend auf der obigen Erklärung lässt sich leicht das entsprechende Szenario ausarbeiten. Der Schlüssel zur Verwendung von Synchronized besteht darin, einen Monitor zu erstellen, der geändert werden soll, oder andere Objekte, die Ihrer Meinung nach geeignet sind, z. B. Methoden, und dann den Monitor zu sperren, um Thread-Sicherheit zu erreichen Nach der Erlangung dieser Sperre wird der Vorgang „Laden in den Arbeitsspeicher -> verwenden&assign –> in den Hauptspeicher“ ausgeführt, bevor die erworbene Sperre aufgehoben wird. Dadurch wird die sogenannte Thread-Sicherheit erreicht. Was ist Thread-Sicherheit? Wie wird Thread-Sicherheit erreicht (Prinzip)? Thread-Sicherheit bedeutet, dass mehrere Threads auf denselben Code zugreifen, ohne unsichere Ergebnisse zu erzeugen. Beim Schreiben von Thread-sicherem Code ist die Thread-Synchronisierung gering. [Empfohlenes Lernen:Java-Video-Tutorial
]Vector, ArrayList, LinkedList
Vector und ArrayList sind in der Verwendung sehr ähnlich. Sie können beide verwendet werden, um eine Menge variabler Anzahl von Objekten darzustellen, und auf die Elemente kann zufällig zugegriffen werden.Die Methoden von Vector sind alle synchronisiert (Synchronisiert) und Thread-sicher, die Methoden von ArrayList jedoch nicht. Da die Thread-Synchronisierung zwangsläufig Auswirkungen auf die Leistung hat, ist die Leistung von ArrayList besser als die von Vector.
Der Unterschied zwischen ArrayList und LinkedList
Für die Verarbeitung einer Spalte von Datenelementen bietet Java zwei Klassen, ArrayList und LinkedList. Die interne Implementierung von ArrayList basiert auf internes Array Object[], also konzeptionell ähnelt es eher einem Array, aber die interne Implementierung von LinkedList basiert auf einer Reihe verbundener Datensätze, sodass es eher einer verknüpften Listenstruktur ähnelt, sodass es einen großen Leistungsunterschied gibt.Aus der obigen Analyse geht hervor, 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 Datenspalte statt vorne oder in der Mitte, und Sie müssen zufällig auf die Elemente zugreifen. Die Verwendung von ArrayList bietet eine bessere Leistung.
Und wenn Sie auf ein Element in der verknüpften Liste zugreifen, müssen Sie an einem Ende der Liste beginnen Wenn Sie also Daten vor oder in der Mitte einer Datenspalte hinzufügen oder löschen möchten, suchen Sie Element für Element entlang der Verbindungsrichtung sollte LinkedList verwenden. Wenn die Situationen 1 und 2 abwechselnd in der Programmierung 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 ihre Leistung durch die spezifische Implementierung sichergestellt.HashTable, HashMap, HashSet
HashTable und HashMap verwenden denselben Speichermechanismus und ihre Implementierung ist grundsätzlich gleich: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 Aufrufen der Put-Methode in 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 sucht basierend auf dem Schlüssel-Hash nach dem Speicherort des Eintragsobjekts im Array 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 IteratorHashTable
1.2. Weder Schlüssel noch Wert in HashTable dürfen null sein.
3. HashTable-Durchquerung verwendet Enumeration. TreeSet,TreeMapTreeSet:
1. TreeSet wird basierend auf TreeMap implementiert und unterstützt die Sortierung.2. TreeSet ist nicht threadsicher.
Aus der Beschreibung von HashSet und TreeSet geht hervor, dass TreeSet wie HashSet vollständig auf Map basiert und weder get(int) unterstützt, um das Element an der angegebenen Position abzurufen (außerdem muss TreeSet durchlaufen werden, um es abzurufen). Bietet einige Sortierunterstützung wurde hinzugefügt. Übergeben Sie beispielsweise die Comparator-Implementierung, descendingSet, descendingIterator usw.
TreeMap:
1. TreeMap ist eine typische Map-Implementierung, die auf Rot-Schwarz-Bäumen basiert und daher eine Schlüsselvergleichsmethode oder die Übergabe an eine Komparator-Implementierung erfordert , oder das Schlüsselobjekt implementiert die Comparable-Schnittstelle.
2. TreeMap ist nicht threadsicher.
Zusammenfassung
Das Obige ist der gesamte Inhalt dieses Artikels zur detaillierten Erläuterung der Thread-Sicherheit verschiedener Java-Sammlungen. Ich hoffe, dass er für alle hilfreich ist.
Dieser Artikel stammt aus der Rubrik Java-Einführung, willkommen zum Lernen!
Das obige ist der detaillierte Inhalt vonVertiefendes Verständnis der Thread-Sicherheit verschiedener Sammlungen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!