Heim > Java > javaLernprogramm > Ist Arraylist-Thread sicher?

Ist Arraylist-Thread sicher?

(*-*)浩
Freigeben: 2019-06-05 11:58:43
Original
11080 Leute haben es durchsucht

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.

Ist Arraylist-Thread sicher?

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.
    }
}
Nach dem Login kopieren

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>data=new ArrayList>();

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>>());
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage