Documentación sobre synchronizedList establece que,Java lista sincronizada de bucle
Es imperativo que el usuario sincronizar manualmente en la lista devuelta cuando se itera sobre ella:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
no seguir este consejo puede dar como resultado un comportamiento no determinista.
Esto parece bastante claro, pero solo quería confirmar que se prohíbe una para cada ciclo. Por ejemplo, no puedo hacer algo como lo siguiente ¿no?
List<MyType> list = Collections.synchronizedList(new ArrayList(<MyType>));
...
synchronized(list){
for(MyType m : list){
foo(m);
m.doSomething();
}
}
¿Por qué estaría prohibido? El bytecode generado es prácticamente el mismo. Foreach usa el iterador ... –
Parece que synchronizedList solo decora las llamadas al método con sincronización, pero tiene limitaciones. Tal vez los diseñadores deberían haber decorado el método del iterador también, y devolver un iterador sincronizado. El texto está en el idioma y no se puede decorar tan fácilmente XD: –