Почему PathRoutePredicateFactory использует синхронизацию в весеннем облачном шлюзе? - PullRequest
0 голосов
/ 14 апреля 2020

Я думаю, что в этом коде есть проблема с производительностью.

public Predicate<ServerWebExchange> apply(Config config) {
  final ArrayList<PathPattern> pathPatterns = new ArrayList<>();
  synchronized (this.pathPatternParser) {
   pathPatternParser.setMatchOptionalTrailingSeparator(config.isMatchOptionalTrailingSeparator());
   config.getPatterns().forEach(pattern -> {
     PathPattern pathPattern = this.pathPatternParser.parse(pattern);
     pathPatterns.add(pathPattern);
   });
  }
}

Можем ли мы использовать ThreadLocal для повышения производительности - вот так?

private ThreadLocal<PathPatternParser> pathPatternParserThreadLocal = ThreadLocal.withInitial(PathPatternParser::new); 
...
public Predicate<ServerWebExchange> apply(Config config) {
  final ArrayList<PathPattern> pathPatterns = new ArrayList<>();
  PathPatternParser pathPatternParser = pathPatternParserThreadLocal.get();
  pathPatternParser.setMatchOptionalTrailingSeparator(config.isMatchOptionalTrailingSeparator());
  config.getPatterns().forEach(pattern -> {
    PathPattern pathPattern = this.pathPatternParser.parse(pattern);
    pathPatterns.add(pathPattern);
  });
}


...