मैं समझता हूं कि हैशटेबल जैसे संग्रह सिंक्रनाइज़ किए गए हैं, लेकिन क्या कोई मुझे कैसे समझा सकता है यह यह काम करता है, और किस बिंदु पर पहुंच समवर्ती कॉल तक सीमित है? उदाहरण के लिए, मान लीजिए कि मैं इस तरह कुछ iterators का उपयोग करते हैं:जब इटरेटर का उपयोग किया जाता है तो संग्रह के सिंक्रनाइज़ेशन की व्याख्या करें?
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>();
}
अगर कोई अलग धागे से यादृच्छिक पर इन कार्यों बुला मेरे साथ नुकसान कर रहे हैं किसी को समझाने कृपया कर सकते हैं? इटेटरेटर, विशेष रूप से, इसके सिंक्रनाइज़ेशन को कैसे करता है, खासकर जब यह एंट्रीसेट() का उपयोग कर रहा है, जो सिंक्रनाइज़ेशन की भी आवश्यकता होगी? क्या होता है अगर स्पष्ट() कहा जाता है जबकि लूप में से एक प्रगति पर है? क्या होगा अगर हटाए गए() किसी आइटम को हटा दें जो अभी तक dosomething1() में समवर्ती पाश द्वारा संसाधित नहीं किया गया है?
किसी भी मदद के लिए धन्यवाद! जावा में संग्रह से अधिक
उत्तर फिक्स्ड: मॉनीटर का इस्तेमाल वास्तव में रैपर संग्रह है, मूल नहीं। – Dirk
यह बहुत उपयोगी है और बहुत अच्छी तरह प्रस्तुत किया गया है। मुझे एक स्रोत खोजने में परेशानी हो रही थी जो स्पष्ट रूप से बताती है, इसलिए बहुत बहुत धन्यवाद! – DivideByHero
"जावा में संग्रह पर इटरेशन थ्रेड सुरक्षित नहीं है, भले ही आप सिंक्रनाइज़ किए गए रैपरों में से एक का उपयोग कर रहे हों" ओ_ओ भयानक – rkarajan