क्या निम्न कोड synchronizedMap
पर कॉल को सही तरीके से सिंक्रनाइज़ करने के लिए सेट किया गया है?जावा सिंक्रनाइज़ ब्लॉक बनाम संग्रह। सिंक्रनाइज़ किए गए मैप
public class MyClass {
private static Map<String, List<String>> synchronizedMap = Collections.synchronizedMap(new HashMap<String, List<String>>());
public void doWork(String key) {
List<String> values = null;
while ((values = synchronizedMap.remove(key)) != null) {
//do something with values
}
}
public static void addToMap(String key, String value) {
synchronized (synchronizedMap) {
if (synchronizedMap.containsKey(key)) {
synchronizedMap.get(key).add(value);
}
else {
List<String> valuesList = new ArrayList<String>();
valuesList.add(value);
synchronizedMap.put(key, valuesList);
}
}
}
}
मेरी समझ से, मैं इससे पहले कि मैं put()
करने के लिए कॉल के माध्यम से प्राप्त remove()
या containsKey()
कॉल करने से एक और धागा को रोकने के लिए addToMap()
में सिंक्रनाइज़ ब्लॉक की जरूरत है, लेकिन क्योंकि एक और धागा प्रवेश नहीं कर सकते मैं doWork()
में एक तुल्यकालन ब्लॉक की जरूरत नहीं है में सिंक्रनाइज़ ब्लॉक remove()
से पहले लौटाता है क्योंकि मैंने मूल रूप से Collections.synchronizedMap()
के साथ मानचित्र बनाया था। क्या वो सही है? क्या ऐसा करने के लिए इससे अच्छा तरीका है?
में मैं इसे लगता है जब यह उल्लेख करना अच्छा होगा कि यह काम करता है क्योंकि javadocs स्पष्ट रूप से बताता है कि सिंक्रनाइज़मैप मानचित्र पर ही सिंक्रनाइज़ करता है, और कुछ आंतरिक लॉक नहीं। अगर वह सिंक्रनाइज़ किया गया था (सिंक्रनाइज़मैप) सही नहीं होगा। – extraneon
@ युवाल क्या आप थोड़ा सा गहराई में अपना उत्तर समझा सकते हैं? आप कहते हैं कि सिंक्रनाइज़मैप परमाणु रूप से संचालन करता है, लेकिन फिर सिंकमैप ने आपके सभी परिचालन परमाणु बनाये तो आपको कभी भी अपने सिंक्रनाइज़ किए गए ब्लॉक की आवश्यकता क्यों होगी? आपका पहला अनुच्छेद दूसरे के बारे में चिंता करने से रोकता है। – almel
@almel मेरी [जवाब] को देखने के (http://stackoverflow.com/questions/567068/java-synchronized-block-vs-collections-synchronizedmap/32608663#32608663) – Sergey