¿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
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
synchronized(syncList) {
for (Integer thisInt : syncList) {
}
}
}
}}).start();
}
}
… mientras que el siguiente se comporta como debería:
import java.util.*;
public class SynchSucceed {
static List
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?
davy.ai
El código en el primer ejemplo genera una
ConcurrentModificationException
muy rápido debido a que los dos hilos están accediendo alLIST
sin sincronización. El segundo ejemplo se comporta como se espera porque laLIST
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
ConcurrentModificationException
s.