У меня есть список, который я синхронизирую по имени synchronizedMap
в моей функции doMapOperation
. В этой функции мне нужно добавлять / удалять элементы с карты и выполнять дорогостоящие операции с этими объектами. Я знаю, что не хочу вызывать дорогостоящую операцию в синхронизированном блоке, но я не знаю, как убедиться, что карта находится в согласованном состоянии, пока я выполняю эти операции. Как правильно это сделать?
Это мой первоначальный макет, который, я уверен, неверен, потому что вы хотите избежать вызова дорогостоящей операции в синхронизированном блоке:
public void doMapOperation(Object key1, Object key2) {
synchronized (synchronizedMap) {
// Remove key1 if it exists.
if (synchronizedMap.containsKey(key1)) {
Object value = synchronizedMap.get(key1);
value.doExpensiveOperation(); // Shouldn't be in synchronized block.
synchronizedMap.remove(key1);
}
// Add key2 if necessary.
Object value = synchronizedMap.get(key2);
if (value == null) {
Object value = new Object();
synchronizedMap.put(key2, value);
}
value.doOtherExpensiveOperation(); // Shouldn't be in synchronized block.
} // End of synchronization.
}
Я думаю, как продолжение этого вопроса, как бы вы сделали это в цикле?
public void doMapOperation(Object... keys) {
synchronized (synchronizedMap) {
// Loop through keys and remove them.
for (Object key : keys) {
// Check if map has key, remove if key exists, add if key doesn't.
if (synchronizedMap.containsKey(key)) {
Object value = synchronizedMap.get(key);
value.doExpensiveOperation(); // Shouldn't be here.
synchronizedMap.remove(key);
} else {
Object value = new Object();
value.doAnotherExpensiveOperation(); // Shouldn't here.
synchronizedMap.put(key, value);
}
}
} // End of synchronization block.
}
Спасибо за помощь.