Iterable java list problemas de concurrencia roundrobin

ConcurrentModificationException se genera porque itera sobre la lista mientras algunos subprocesos agregan un elemento a la lista.

Está utilizando Collections.synchronizedList , donde los métodos de agregar y quitar se sincronizan mediante el bloqueo de lista. Para prohibir a los demás agregar algo a la lista mientras está iterando la lista con el iterador, debe bloquear esa lista de esta manera.

synchronized(list){
Iterator i = list.iterator(); 
      while (i.hasNext()){
        //do something
  }
}

No está haciendo esto, está sincronizando el método getNext pero no con el bloqueo de lista y está sincronizando solo cuando llama al método next () que no es suficiente.

 public synchronized T getNext() {
    return this.elements.next();;
  }

Si desea utilizar su patrón, debe crear la copia de la lista en su RoundRobinIterable

import java.util.Iterator;
import java.util.List;

import com.google.common.collect.Iterables;

public class RoundRobinIterable<T> {
  private final Iterator<T> elements;

  public RoundRobinIterable(final List<T> elements) {
    List<T> copyOfElements = new ArrayList<>(elements);
    this.elements = Iterables.cycle(copyOfElements).iterator();
  }

  public synchronized T getNext() {
    return this.elements.next();;
  }
}

Ahora nadie puede agregar un elemento a la lista copiada mientras está iterando la lista, pero no obtendrá los elementos que agregue a la lista original después de crear RoundRobinIterable. Si desea obtener los elementos que se agregan más tarde, entonces es mejor usar algo más que List. Por ejemplo, ConcurrentLinkedQueue.

Respuesta 1

Tengo cierta confusión con la instrucción set chained en el método setAutoCommit () en net.sourceforge.jtds.jdbc.Driver El código fuente dice: 2161 if (serverType == Driver.SYBASE) {2162 if (...

Estoy escribiendo una pequeña aplicación en la que quiero una interfaz gráfica de usuario que divide una ventana en dos secciones, cada una de las cuales será controlada por un JPanel. Quiero agregar un campo de entrada y un conjunto de botones en ...

Estoy trabajando en un juego de disparos para el proyecto de programación de mi escuela y utilizando la detección de colisiones con actores. más tarde me di cuenta de que necesitaba usar otro método que pueda devolver a todos los actores en un área ...

He estado tratando de desplegar un artefacto automáticamente durante semanas en Bintray y sincronizarlo con Maven Central, todo dentro del sistema de construcción Travis. Pude subir a Bintray, pero la sincronización a ...