Capisco che le raccolte come Hashtable siano sincronizzate, ma qualcuno può spiegarmi come funziona come ea che punto l'accesso è limitato alle chiamate simultanee? Per esempio, diciamo che faccio uso di iteratori come questo:Spiega la sincronizzazione delle raccolte quando vengono utilizzati gli iteratori?
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>();
}
Qualcuno può spiegare se ci sono delle insidie con me chiamano queste funzioni a caso da diversi thread? In che modo l'iteratore, in particolare, fa la sua sincronizzazione, specialmente quando usa entrySet(), che sembrerebbe richiedere anche la sincronizzazione? Cosa succede se clear() viene chiamato mentre è in corso uno dei loop? Cosa succede se removesomething() rimuove un oggetto che non è ancora stato elaborato da un ciclo concorrente in dosomething1()?
Grazie per qualsiasi aiuto!
Risolto il problema: il monitor utilizzato è in realtà la collezione di wrapper, non quella originale. – Dirk
Questo è super utile e presentato molto bene. Avevo difficoltà a trovare una fonte che spiegasse chiaramente questo, quindi grazie mille! – DivideByHero
"L'iterazione su raccolte in Java non è thread-safe, anche se si sta utilizzando uno dei wrapper sincronizzati" O_o terrible – rkarajan