Как заменить одновременно экземпляр без потери данных? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть много потоков, которые сохраняют состояние, и один поток, который регистрирует состояние.

Я бы хотел не потерять данные, что означает всегда регистрировать последнее состояние.

Решение, которое у меня есть, заключается в использовании блокировки чтения-записи при замене / очистке коллекции статистики, которая не потеряет данные, но выглядит очень громоздкой.См. Код ниже.

Мне бы хотелось, чтобы какой-то способ выполнял некоторый код атомарно, пока экземпляр не изменился.Само собой разумеется, что изменение экземпляра также должно быть атомарным.

Громоздкое решение (нет 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();
        }
    }
}
...