У меня есть компонент с состоянием в многопоточной среде, который сохраняет свое состояние на карте.Теперь мне нужен способ заменить все значения этой карты в одном атомарном действии.
public final class StatefulBean {
private final Map<String, String> state = new ConcurrentSkipListMap<>();
public StatefulBean() {
//Initial state
this.state.put("a", "a1");
this.state.put("b", "b1");
this.state.put("c", "c1");
}
public void updateState() {
//Fake computation of new state
final Map<String, String> newState = new HashMap<>();
newState.put("b", "b1");
newState.put("c", "c2");
newState.put("d", "d1");
atomicallyUpdateState(newState);
/*Expected result
* a: removed
* b: unchanged
* C: replaced
* d: added*/
}
private void atomicallyUpdateState(final Map<String, String> newState) {
//???
}
}
В настоящее время я использую ConcurrentSkipListMap
в качестве реализации ConcurrentMap
, но это не является обязательным требованием.
Единственный способ решить эту проблему - сделать глобальный state
volatile
и полностью заменить карту или использовать AtomicReferenceFieldUpdater
.Есть ли лучший способ?
Мои обновления довольно часты, один или два раза в секунду, но, скорее всего, очень мало значений.Также вся карта будет содержать только менее 20 значений.