14 Stimmen

wie man eine synchronisierte Array-Liste erstellt

Ich habe synchronisierte arrayList wie folgt erstellt

import java.text.SimpleDateFormat;
import java.util.*;

class HelloThread  
{

 int i=1;
 List arrayList;
  public  void go()
  {
 arrayList=Collections.synchronizedList(new ArrayList());
 Thread thread1=new Thread(new Runnable() {

  public void run() {
  while(i<=10)
  {
   arrayList.add(i);
   i++;
  }
  }
 });
 thread1.start();
 Thread thred2=new Thread(new Runnable() {
  public void run() {
     while(true)
     {
   Iterator it=arrayList.iterator();
      while(it.hasNext())
      {
       System.out.println(it.next());
      }
     }
  }
 });
 thred2.start();
  }
 }

public class test
{
  public static void main(String[] args)
  {
   HelloThread hello=new HelloThread();
   hello.go();
  }
}

aber ich erhalte eine Ausnahme wie diese

Ausnahme im Thread "Thread-1" java.util.ConcurrentModificationException

Stimmt etwas nicht mit meinem Ansatz?

0voto

Spike Gronim Punkte 6076

Sie dürfen eine Sammlung, die Sie gerade iterieren, nicht verändern. Sie können dies umgehen, indem Sie auf die Array-Einträge über einen Index und nicht über einen Iterator zugreifen. Ich kann Ihnen weitere Ratschläge geben, wenn Sie mir das Problem nennen, das Sie mit diesem Code zu lösen versuchen.

0voto

Wir nehmen eine normale Liste (implementiert durch die Klasse ArrayList) und machen sie synchronisiert. Dies wird in der Klasse SynchronizedArrayList gezeigt. Wir übergeben der Methode Collections.synchronizedList eine neue ArrayList mit Strings. Die Methode gibt eine synchronisierte Liste von Strings zurück. //Hier ist die Klasse SynchronizedArrayList package com.mnas.technology.automation.utility; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util; import org.apache.log4j.Logger; /** * * @author manoj.kumar * @email kumarmanoj.mtech@gmail.com * */ public class SynchronizedArrayList { static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName()); public static void main(String[] args) {

List<String> synchronizedList = Collections.synchronizedList(new ArrayList<String>());
synchronizedList.add("Aditya");
synchronizedList.add("Siddharth");
synchronizedList.add("Manoj");

// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<String> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Synchronized Array List Items: " + iterator.next());
}
}

}
}

Notice that when iterating over the list, this access is still done using a synchronized block that locks on the synchronizedList object. 
In general, iterating over a synchronized collection should be done in a synchronized block

0voto

Bhargav ram Punkte 31

ArrayList ist eine unsynchronisierte Auflistung und sollte nicht in einer nebenläufigen Umgebung ohne explizite Synchronisation verwendet werden. Um ArrayList zu synchronisieren, können wir zwei vom JDK bereitgestellte Methoden verwenden

  • Collections.synchronizedList()-Methode - Sie gibt eine synchronisierte Liste zurück, die auf der angegebenen Liste basiert. Es wird empfohlen, die zurückgegebene Liste manuell zu synchronisieren, wenn sie mittels Iterator, Spliterator oder Stream durchlaufen wird. Andernfalls kann es zu einem nicht-deterministischen Verhalten kommen. Zum Hinzufügen und Entfernen von Elementen aus einer synchronisierten Array-Liste ist keine explizite Synchronisierung erforderlich.
  • CopyOnWriteArrayList Klasse - Es ist eine thread-sichere Variante von ArrayList.

Da Sie Iterator ohne explizite Synchronisierung verwenden, erhalten Sie den Fehler

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X