我正在通过调用add
方法从多个线程填充我的番石榴缓存。现在从每 30 秒运行一次的后台线程,我想将缓存中的任何内容发送到sendToDB
原子方法?
下面是我的代码:
public class Example {
private final ScheduledExecutorService executorService = Executors
.newSingleThreadScheduledExecutor();
private final Cache<Integer, List<Process>> cache = CacheBuilder.newBuilder().maximumSize(100000)
.removalListener(RemovalListeners.asynchronous(new CustomRemovalListener(), executorService))
.build();
private static class Holder {
private static final Example INSTANCE = new Example();
}
public static Example getInstance() {
return Holder.INSTANCE;
}
private Example() {
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// is this the right way to send cache map?
sendToDB(cache.asMap());
}
}, 0, 30, SECONDS);
}
// this method will be called from multiple threads
public void add(final int id, final Process process) {
// add id and process into cache
}
// this will only be called from single background thread
private void sendToDB(ConcurrentMap<Integer, List<Process>> holder) {
// use holder here
}
}
这是将cache
地图发送到我的方法的正确sendToDB
方法吗?基本上我想发送 30 秒内缓存中的所有条目并清空缓存。之后,我的缓存将在接下来的 30 秒内再次填充,然后执行相同的过程?
我认为 usingcache.asMap()
可能不是正确的方法,因为它不会清空缓存,所以它也会反映我的sendToDB
方法中缓存上发生的所有更改?