在servlet的doGet()中使用静态编译模式是安全的 - matcher.replaceAll()

Men*_*los 0 java multithreading tomcat servlets pattern-matching

有没有:

    private static final String LUCENE_ESCAPE_CHARS = "[\\\\+\\-\\!\\(\\)\\:\\^\\]\\{\\}\\~\\*\\?]";
    private static final Pattern LUCENE_PATTERN = Pattern.compile(LUCENE_ESCAPE_CHARS);
    private static final String REPLACEMENT_STRING = "\\\\$0";
Run Code Online (Sandbox Code Playgroud)

并在诸如doGet()servlet之类的多线程环境中使用以下内容?

String escaped = LUCENE_PATTERN.matcher(query).replaceAll(REPLACEMENT_STRING);
Run Code Online (Sandbox Code Playgroud)

我主要担心的是现在增加额外的延迟(例如由于锁定)或者存在发生错误的情况.

Nar*_*hai 8

是的它是安全的.Pattern对象是线程安全的Matcher对象不是.您可以与多个线程共享模式实例.

但是不要Matcher在线程之间共享实例.

引用JavaDoc for Pattern

此类的实例是不可变的,并且可以安全地供多个并发线程使用.Matcher该类实例适合此类使用.