Entiendo que las colecciones como Hashtable están sincronizadas, pero ¿alguien me puede explicar cómo funciona, y en qué punto (s) el acceso está restringido a llamadas simultáneas? Por ejemplo, digamos que yo uso algunos iteradores como este:¿Explicar la sincronización de colecciones cuando se usan iteradores?
Hashtable<Integer,Integer> map = new Hashtable<Integer,Integer>();
void dosomething1(){
for (Iterator<Map.Entry<Integer,Integer>> i = map.entrySet().iterator(); i.hasNext();){
// do something
}
}
void dosomething2(){
for (Iterator<Map.Entry<Integer,Integer>> i = map.entrySet().iterator(); i.hasNext();){
// do something
// and remove it
i.remove();
}
}
void putsomething(int a, int b){
map.put(a,b);
}
void removesomething(int a){
map.remove(a);
}
var clear(){
map = new Hashtable<Integer,Integer>();
}
Por favor alguien puede explicar si hay dificultades con que me llama estas funciones al azar en diferentes hilos? ¿Cómo hace el iterador, en particular, su sincronización, especialmente cuando está utilizando entrySet(), que también parece requerir sincronización? ¿Qué ocurre si se invoca clear() mientras uno de los bucles está en curso? ¿Qué ocurre si removevesomething() elimina un elemento que todavía no se procesa mediante un bucle simultáneo en dosomething1()?
¡Gracias por cualquier ayuda!
Se corrigió la respuesta: el monitor utilizado es realmente la colección contenedora, no la original. – Dirk
Eso es súper útil y se presenta muy bien. Estaba teniendo problemas para encontrar una fuente que explique esto claramente, ¡muchas gracias! – DivideByHero
"La iteración sobre colecciones en Java no es segura para subprocesos, incluso si está utilizando una de las envolturas sincronizadas" O_o terrible – rkarajan