Heim >Java >javaLernprogramm >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!