访问Spring bean类时发生并发修改异常

时间:2019-01-11 12:40:10

标签: java spring

我有一个在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是否可以解决问题?由于它只能在生产中无法复制,因此我无法尝试反复尝试。请帮助我解决这个问题。

2 个答案:

答案 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();
    }
}

当然,由于问题中遗漏了相关细节,因此可能无法实现。