निम्नलिखित कोड को कॉल को सही ढंग से सिंक्रनाइज़ करने के लिए सेट किया गया है 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);
}
}
}
}
मेरी समझ से, मुझे addToMap()
किसी अन्य थ्रेड को कॉल करने remove()
से containsKey()
पहले या कॉल के माध्यम से प्राप्त करने से पहले put()
सिंक्रनाइज़ किए गए ब्लॉक की आवश्यकता है, लेकिन मुझे एक सिंक्रनाइज़ किए गए ब्लॉक की आवश्यकता नहीं है doWork()
क्योंकि एक और थ्रेड रिटर्न addToMap()
से पहले सिंक्रनाइज़ किए गए ब्लॉक में प्रवेश नहीं कर सकता remove()
क्योंकि मैंने मूल रूप से मैप बनाया था के साथ Collections.synchronizedMap()
। क्या वो सही है? क्या ऐसा करने के लिए इससे अच्छा तरीका है?