Hashtable gibi koleksiyonların senkronize olduğunu anlıyorum, ancak birisi bana 'un nasıl çalıştığını ve'un nasıl çalıştığını ve eşzamanlı çağrılar için hangi noktaya erişimin kısıtlandığını anlayabilirim? Örneğin, bu gibi bazı iteratörler diyelim:Yineleyiciler kullanıldığında koleksiyonların senkronizasyonunu açıklar mısınız?
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>();
}
farklı parçacığı rastgele bu işlevleri çağıran benimle herhangi tuzaklar varsa birisi açıklayabilir misiniz? Yineleyici, özellikle, senkronizasyon gerektirecek gibi, özellikle inputSet() kullanırken, senkronizasyonunu nasıl yapar? Döngülerden biri devam ederken clear() çağrılırsa ne olur? Removeesomething1(), henüz bir eşzamanlı döngü tarafından işlenmemiş bir öğeyi dosomething1()?
Yardımlarınız için teşekkürler! Eğer senkronize sarmalayıcıların birini (Collections.synchronizedMap(...)
) kullanıyor olsalar bile Java koleksiyonları üzerinde
Yanıtı düzelttim: kullanılan ekran aslında orijinal olan değil sarmalayıcı koleksiyonudur. – Dirk
Bu süper yararlı ve çok iyi sundu. Açıkça açıklayan bir kaynak bulmakta zorlanıyordum, bu yüzden çok teşekkürler! – DivideByHero
"Java'daki koleksiyonlar üzerinde yineleme, senkronize edilmiş sarmalayıcılardan birini kullanıyor olsanız bile, iş parçacığı güvenli değildir." O_o korkunç – rkarajan