我有一个在Tomcat服务器和Java 11上运行的Web应用程序。我有一个像
这样的spring bean类。@Component
public class PatternMatcher {
private Map<String, Pattern> patterns = new HashMap<>();
String regEx = "(?i)apc\.[A-z]{2}\.011\.[0-9]+\.02.*";
public boolean isAMatch(String exp){
return getMatcherPattern().matcher(exp).matches();
}
private Pattern getMatcherPattern(){
return patterns.computeIfAbsent(regex, Pattern::compile);
}
}
该类在其他一些类中注入,并且在我的本地环境和测试环境中可以正常工作。但是在生产中,我会看到
这样的间歇性日志java.util.ConcurrentModificationException:空 在java.base / java.util.HashMap.computeIfAbsent(未知来源)
是因为有多个请求正在访问地图吗?如果是,使用ConcurrentHashmap是否可以解决问题?由于它只能在生产中无法复制,因此我无法尝试反复尝试。请帮助我解决这个问题。
答案 0 :(得分:0)
是因为有多个请求正在访问地图吗?
是的,看起来很像
如果是,使用ConcurrentHashmap是否可以解决问题?
这可能是一种解决方案。这取决于您在这里实际做什么。
答案 1 :(得分:0)
对于您在此处显示的代码,拥有Map
毫无意义。
只需简单地一次急切地编译正则表达式,然后重复使用它即可完全避免该问题:
public class PatternMatcher {
private static final Pattern PATTERN =
Pattern.compile("(?i)apc\.[A-z]{2}\.011\.[0-9]+\.02.*");
public boolean isAMatch(String exp) {
return PATTERN.matcher(exp).matches();
}
}
当然,由于问题中遗漏了相关细节,因此可能无法实现。