我有很多线程保存状态,一个线程记录状态。
我不想丢失数据,这意味着始终记录最新状态。
我的解决方案是在替换/清除统计数据集合时使用读写锁,这样不会丢失数据但看起来很麻烦。请参阅下面的代码。
我想要的是在不更改实例的情况下以原子方式运行一些代码的某种方式。不用说,实例更改也应该是原子的。
繁琐的解决方案(不,,,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();
}
}
}