Mã sau có được thiết lập để đồng bộ hóa các cuộc gọi một cách chính xác synchronizedMap
không?
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);
}
}
}
}
Theo hiểu biết của tôi, tôi cần khối được đồng bộ hóa trong addToMap()
để ngăn luồng khác gọi remove()
hoặc containsKey()
trước khi tôi thực hiện lệnh gọi đến put()
nhưng tôi không cần khối được đồng bộ hóa trong doWork()
vì một chuỗi khác không thể nhập khối được đồng bộ hóa trong addToMap()
trước khi remove()
trả về vì tôi đã tạo Bản đồ ban đầu với Collections.synchronizedMap()
. Đúng không? Có cách nào tốt hơn để làm điều này?