es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cuál es el valor de las colecciones sincronizadas de Java?

El siguiente código desencadena una ConcurrentModificationException muy, muy rápido:

import java.util.*;
public class SynchFail {
static List LIST = new ArrayList();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
LIST.add(1);
}
}}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
List syncList = Collections.synchronizedList(LIST);
synchronized(syncList) {
for (Integer thisInt : syncList) {
}
}
}
}}).start();
}
}

… mientras que el siguiente se comporta como debería:

import java.util.*;
public class SynchSucceed {
static List LIST = new ArrayList();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized(LIST) {
LIST.add(1);
}
}
}}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized(LIST) {
for (Integer thisInt : LIST) {
}
}
}
}}).start();
}
}

… mi entendimiento era que las colecciones sincronizadas estaban destinadas a prevenir las ConcurrentModificationExceptions en situaciones como esta (pero claramente no lo hacen).

Dado esto: ¿dónde debería hacer uso de ellos?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El código en el primer ejemplo genera una ConcurrentModificationException muy rápido debido a que los dos hilos están accediendo al LIST sin sincronización. El segundo ejemplo se comporta como se espera porque la LIST está sincronizada cuando es accedida por los dos hilos.

    Las colecciones sincronizadas deben ser usadas cuando varios hilos necesitan acceder a la misma colección. Esto asegura que la colección no sea modificada mientras está siendo accedida por un hilo, lo cual evita ConcurrentModificationExceptions.

Comments are closed.