Как заменить одновременно экземпляр без потери данных?
У меня есть много потоков, которые сохраняют состояние, и один поток, который регистрирует состояние.
Я хотел бы не потерять данные, что означает всегда регистрировать последнее состояние.
У меня есть решение использовать блокировку чтения-записи при замене / очистке коллекции статистики, которая не потеряет данные, но выглядит очень громоздкой. Смотрите код ниже.
То, что я хотел бы, это какой-то способ выполнить некоторый код атомарно, в то время как экземпляр не изменился. Само собой разумеется, что изменение экземпляра также должно быть атомарным.
Громоздкое решение (нет private
, final
, static
нарочно):
class StatsProvider {
volatile Set<Status> stats = ConcurrentHashMap.newKeySet();
ReadWriteLock replaceStatsLock = new ReentrantReadWriteLock();
void log() {
replaceStatsLock.writeLock().lock();
Set<QueueStatus> stats;
try
{
stats = StatsProvider.stats;
recentQueuesStats = ConcurrentHashMap.newKeySet();
}
finally
{
replaceStatsLock.writeLock().unlock();
}
log(stats);
}
void report(Status Status) {
replaceStatsLock.readLock().lock();
try
{
stats.add(Status);
}
finally
{
replaceStatsLock.readLock().unlock();
}
}
}