поле, и атомарно поменяйте поле для нового пустого кэша, затем скопируйте содержимое старого кэша в базу данных и разрешите его GCed.

олняю свой кеш guava из нескольких потоков, вызывая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 секунд, а затем выполнить тот же процесс?

Я думаю, используяcache.asMap() может быть неправильным путем, так как он не очищает кэш, поэтому он будет отражать все изменения, происходящие с кешем в моемsendToDB метод, а?

Ответы на вопрос(1)

Ваш ответ на вопрос