如何在不丢失数据的情况下替换并发实例?

时间:2018-11-26 13:56:32

标签: java concurrency locking readwritelock

我有许多保存状态的线程和一个记录状态的线程。

我希望不丢失数据,这意味着始终记录最新状态。

我要解决的方法是在替换/清除stats集合时使用读写锁,这不会丢失数据,但看起来很麻烦。参见下面的代码。

我想要的是在不更改实例的情况下自动运行某些代码的某种方式。不用说实例更改也应该是原子的。

麻烦的解决方案(故意不使用privatefinalstatic

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();
        }
    }
}

0 个答案:

没有答案