Como ya sabemos , Colecciones, que no son más que colecciones de Objetos donde tratamos los Objetos utilizando algunos métodos predefinidos. Pero hay varios problemas que ocurren cuando usamos el concepto de colecciones en subprocesos múltiples. Los problemas que ocurren al usar Colecciones en una aplicación de subprocesos múltiples:
- La mayoría de los objetos de las clases de colecciones (como ArrayList , LinkedList , HashMap , etc.) no están sincronizados por naturaleza, es decir, varios subprocesos pueden funcionar en un objeto a la vez simultáneamente. Por lo tanto, los objetos no son seguros para subprocesos.
- Muy pocos objetos de clases (como Vector , Stack , HashTable ) están sincronizados por naturaleza, es decir, a la vez, solo un subproceso puede funcionar en un objeto. Pero aquí el problema es que el rendimiento es bajo porque, en un momento, un solo subproceso ejecuta un objeto y el resto del subproceso tiene que esperar.
- El principal problema es cuando un subproceso está iterando un objeto Colecciones, entonces si otro subproceso no puede modificar el contenido del objeto. Si otro subproceso intenta modificar el contenido del objeto, obtendremos RuntimeException diciendo ConcurrentModificationException.
- Debido a la razón anterior, las clases de colecciones no son adecuadas o podemos decir que son una buena opción para aplicaciones de subprocesos múltiples.
Para superar el problema anterior, SUN microSystem introdujo una nueva función en JDK 1.5Version, que no es más que colecciones concurrentes.
// Java program to illustrate Concurrent // Collection need import java.util.*; class ConcurrentDemo extends Thread { static ArrayList l = new ArrayList(); public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { System.out.println("Child Thread" + " going to add element"); } // Child thread trying to add new // element in the Collection object l.add("D"); } public static void main(String[] args) throws InterruptedException { l.add("A"); l.add("B"); l.add("c"); // We create a child thread that is // going to modify ArrayList l. ConcurrentDemo t = new ConcurrentDemo(); t.start(); // Now we iterate through the ArrayList // and get exception. Iterator itr = l.iterator(); while (itr.hasNext()) { String s = (String)itr.next(); System.out.println(s); Thread.sleep(6000); } System.out.println(l); } }
Salida:
excepción en el subproceso «principal» java.util.ConcurrentModificationException
Publicación traducida automáticamente
Artículo escrito por Bishal Kumar Dubey y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA