Ist Arraylist-Thread sicher?
Was ist Thread-unsicher:
Thread-Sicherheit bedeutet, dass beim Multi-Thread-Zugriff ein Sperrmechanismus verwendet wird, um zu schützen, wenn ein Thread auf bestimmte Daten dieser Klasse zugreift darauf zugreifen, bis dieser Thread mit dem Lesen fertig ist, und dann können andere Threads es verwenden. Es wird keine Dateninkonsistenz oder Datenverschmutzung geben. Thread-Unsicherheit bedeutet, dass kein Datenzugriffsschutz gewährleistet ist. Es ist möglich, dass mehrere Threads nacheinander Daten ändern, was dazu führt, dass es sich bei den erhaltenen Daten um schmutzige Daten handelt.
Eine ArrayList, beim Hinzufügen eines Elements kann sie in zwei Schritten vervollständigt werden:
1 Speichern Sie dies Element an der Position von Items[Size];
2. (Empfohlenes Lernen: Java Video Tutorial)
Wenn im Single-Thread-Betrieb Size = 0 ist, befindet sich das Element nach dem Hinzufügen eines Elements an Position 0 und Size = 1;
Und wenn es sich beispielsweise um eine Multithread-Situation handelt, gibt es zwei Threads, Thread A speichert das Element zuerst an Position 0. Aber zu diesem Zeitpunkt plant die CPU, Thread A anzuhalten, und Thread B erhält die Chance, ausgeführt zu werden. Thread B fügt dieser ArrayList auch Elemente hinzu, da Size zu diesem Zeitpunkt immer noch gleich 0 ist (beachten Sie, dass wir davon ausgehen, dass das Hinzufügen eines Elements zwei Schritte erfordert und Thread A nur Schritt 1 abgeschlossen hat), sodass Thread B auch Elemente zu Stored at hinzufügt Standort 0. Dann werden sowohl Thread A als auch Thread B weiter ausgeführt, wobei beide den Wert von Size erhöhen.
Okay, schauen wir uns nun die ArrayList-Situation an. Es gibt tatsächlich nur ein Element, das an Position 0 gespeichert ist, aber Size ist gleich 2. Das ist „Thread unsicher“.
Beispielprogramm:
package test; importjava.util.ArrayList; import java.util.List; public class ArrayListInThread implements Runnable{ List<String> list1 = new ArrayList<String>();// not thread safe publicvoid run() { try { Thread.sleep((int)(Math.random() * 2)); } catch (InterruptedException e) { e.printStackTrace(); } list1.add(Thread.currentThread().getName()); } public static void main(String[] args) throws InterruptedException { ThreadGroup group = new ThreadGroup("mygroup"); ArrayListInThread t = new ArrayListInThread(); for (int i = 0; i < 10000; i++) { Thread th = new Thread(group, t,String.valueOf(i)); th.start(); } while (group.activeCount() > 0) { Thread.sleep(10); } System.out.println(); System.out.println(t.list1.size()); // it should be 10000 if thread safecollection is used. } }
Wie löst man Thread-Unsicherheit?
Erstens: Verwenden Sie das synchronisierte Schlüsselwort, mit dem jeder vertraut sein sollte, daher werde ich es nicht erklären.
Zweitens: Verwenden Sie Collections.synchronizedList(); wie folgt:
Angenommen, der Code, den Sie erstellen, lautet wie folgt: List
Um dieses Thread-Sicherheitsproblem zu lösen, können Sie Collections.synchronizedList() wie folgt verwenden:
List<Map<String,Object>> data=Collections.synchronizedList(newArrayList<Map<String,Object>>());
Es hat sich nichts anderes geändert, und die verwendete Methode ist fast dieselbe wie bei ArrayList zum API-Dokument;
Weitere Informationen zu Java finden Sie in der Spalte Java-Entwicklungs-Tutorial!
Das obige ist der detaillierte Inhalt vonIst Arraylist-Thread sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

1. Der Unterschied zwischen Iterator und foreach ist der polymorphe Unterschied (die unterste Ebene von foreach ist Iterator ein Schnittstellentyp, und es ist egal, ob for und foreach der Typ bekannt ist). 1. Warum heißt es, dass die unterste Ebene von foreach der von Iterator geschriebene Code ist: 2. Der Unterschied zwischen „remove in foreach“ und „iterator“. im Alibaba Java Development Manual, aber in Fall 1 wird kein Fehler gemeldet, und in Fall 2 wird zuerst ein Fehler gemeldet (java. util.ConcurrentModificationException).

Mit der Methode „contains()“ der Schnittstelle „List“ können Sie prüfen, ob ein Objekt in der Liste vorhanden ist. enthält()-Methode booleancontains(Objecto) Gibt „true“ zurück, wenn diese Liste das angegebene Element enthält. Formeller ausgedrückt: Gibt genau dann „true“ zurück, wenn diese Liste mindestens ein Element e enthält, sodass (o==null?e==null:o.equals(e)). Parameter c – das Element, dessen Anwesenheit in dieser Liste getestet werden soll. Rückgabewert Gibt „true“ zurück, wenn diese Liste das angegebene Element enthält. Löst eine ClassCastException aus – wenn der Typ des angegebenen Elements mit dieser Liste nicht kompatibel ist (optional). NullP

Verwenden Sie die ArrayList.remove()-Funktion von Java, um Elemente aus einer ArrayList zu entfernen. In Java ist ArrayList eine häufig verwendete Sammlungsklasse, die zum Speichern und Betreiben einer Reihe von Elementen verwendet wird. Die ArrayList-Klasse bietet viele Methoden zum Hinzufügen, Löschen, Ändern und Abfragen von Elementen in der Sammlung. Eine der am häufigsten verwendeten Methoden ist „remove()“, mit der Elemente aus einer ArrayList entfernt werden können. Die Methode „remove()“ von ArrayList hat zwei überladene Formen: eine

Verwenden Sie die ArrayList.clear()-Funktion von Java, um die Elemente in der ArrayList zu löschen. In der Java-Programmierung ist ArrayList eine sehr häufig verwendete Datenstruktur, die Elemente dynamisch speichern und darauf zugreifen kann. In einigen Fällen müssen wir jedoch möglicherweise alle Elemente in der ArrayList löschen, um den Speicher wiederzuverwenden oder freizugeben. Zu diesem Zeitpunkt können Sie die Funktion clear () von ArrayList verwenden, um dies zu erreichen. ArrayList.clear()

Warum ist die anfängliche Kapazität von HashMap 16? Wenn wir über die Initialisierungskapazität von ArrayList sprechen, müssen wir zunächst die Initialisierungskapazität von HashMap überprüfen. Am Beispiel des Java8-Quellcodes gibt es in HashMap zwei relevante Faktoren: Initialisierungskapazität und Ladefaktor: /***Thedefaultinitialcapacity-MUSTbeapoweroftwo.*/staticfinalintDEFAULT_INITIAL_CAPACITY=1>1);if(newCapacity-minCapacity0)newCapacity=hugeCapacity

Java verwendet die Funktion contains() der Klasse ArrayList, um zu bestimmen, ob ein Element vorhanden ist. ArrayList ist eine sehr häufig verwendete Datenstruktur in der Java-Programmierung. Es bietet eine flexible Möglichkeit, einen Datensatz zu speichern und zu bearbeiten. Zusätzlich zum einfachen Hinzufügen, Löschen und Zugreifen auf Elemente bietet ArrayList auch einige nützliche Methoden, wie beispielsweise die Funktion enthält(), mit der ermittelt wird, ob ein Element in der ArrayList vorhanden ist. Die Funktion enthält () ist A

ArrayList ist eine Klasse des JavaCollectionFrameworks, das die Listenschnittstelle implementiert. Es ist eine lineare Struktur, die jedes Element nacheinander speichert und darauf zugreift

So fügen Sie Elemente in Java mit der Methode add() der Klasse ArrayList hinzu. ArrayList ist eine der häufigsten Sammlungsklassen in Java. Sie bietet praktische Methoden zum Verwalten von Arrays mit dynamischer Länge. Das Hinzufügen von Elementen zu einer ArrayList ist eine der häufigsten Operationen, und die Methode add() ist eine der Hauptmethoden zur Implementierung dieser Operation. Die Verwendung der Methode add() ist sehr einfach, sie kann ein Element am Ende der ArrayList hinzufügen. Unten finden Sie einen Beispielcode, der die Verwendung von a demonstriert
