รหัสต่อไปนี้ตั้งค่าเพื่อซิงโครไนซ์การโทรอย่างถูกต้อง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()
. ถูกต้องหรือไม่ มีวิธีที่ดีกว่านี้หรือไม่?