নীচের কোডগুলি কলগুলি সঠিকভাবে সিঙ্ক্রোনাইজ করার জন্য সেট আপ করা আছে 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()
। এটা কি ঠিক? এই কাজ করতে একটি ভাল উপায় আছে কি?