在地图上同步读取和写入与整个地图上的潜在更新的最佳方式

问题描述 投票:0回答:0

所以我有这个获取器代码,它获取一个 json 配置,它是一个字符串到布尔值的映射(它是一个有保证的 json 模式)

我必须实现这个方法

private volatile Map<String, Boolean> flags = new ConcurrentHashMap<>();
private volatile String currFlagJson = "";
private final Retriever retriever; // This is initialized elsewhere, but it basically returns a cached json with a separate thread updating it. 

public Optional<Boolean> isFlagEnabled(final String featureFlag) {
   final var json = retriever.retrieve();
   if (!json.equals(currJson.get)) {
       updateMap(json);
       return Optional.ofNullable(flags.get(featureFlag));
   } else {
       return Optional.ofNullable(flags.get(featureFlag));
   }
}

private synchronized updateMap(final String newJson) {
    final var newMap = expensiveJsonParsingOperation(newJson)
    flags = newMap;
    currFlagJson = newJson;
}

我试图避免多个线程同时更新地图,但我认为这并不完全有效。如果多个线程竞争并调用 equals 方法,而其中一个线程正在更新,那么最终所有线程都会尝试竞争更新它。我当然可以同步 isFlagEnabled 的整体,但这也将是不必要的锁定,我可以在昂贵的 JsonParsingOperation 发生时为读取请求提供服务。

我正在想办法做到最好

  1. 确保只有一个线程在需要时更新这张地图。
  2. 在此更新发生时不阻塞读取线程。

也许吧。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?或者我可以在这种情况下使用的其他东西?

java multithreading synchronization
© www.soinside.com 2019 - 2024. All rights reserved.