Я понимаю, что коллекции, подобные Hashtable, синхронизированы, но кто-нибудь может объяснить мне, как это работает, и в какой точке доступа ограничен одновременными вызовами? Например, допустим, что я использую некоторые итераторы следующим образом:
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>();
}
Может ли кто-нибудь объяснить, есть ли какие-то подводные камни, когда я вызываю эти функции наугад из разных потоков? Как итератор, в частности, выполняет свою синхронизацию, особенно когда он использует entrySet(), который, как представляется, также требует синхронизации? Что произойдет, если clear() вызывается, когда выполняется одна из циклов? Что делать, если removeesomething() удаляет элемент, который еще не обработан параллельным циклом в dosomething1()?
Спасибо за любую помощь!