所以我有这个获取器代码,它获取一个 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 发生时为读取请求提供服务。
我正在想办法做到最好
也许吧。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?或者我可以在这种情况下使用的其他东西?