Embora você precise lembrar que a segurança do thread também deve levar em conta o código ao redor, você parece estar com sorte. O fato de que Matchers são criados usando o método de fábrica de matcher do Pattern e não possuem construtores públicos é um sinal positivo. Da mesma forma, você usa o método estático de compilação para criar o padrão abrangente .
Então, em resumo, se você fizer algo como o exemplo:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
você deve estar indo muito bem.
Siga o exemplo de código para maior clareza: observe que este exemplo implica fortemente que o Matcher assim criado é thread-local com o Padrão e o teste. Ou seja, você não deve expor o Matcher assim criado a quaisquer outros threads.
Francamente, esse é o risco de qualquer questão de thread-safety. A realidade é que qualquer código pode se tornar inseguro para thread se você tentar o suficiente. Felizmente, existem livros maravilhosos que nos ensinam uma série de maneiras de arruinar nosso código. Se ficarmos longe desses erros, reduziremos muito nossa própria probabilidade de problemas de encadeamento.
compile()
método pode não ser. Houve dois ou três bugs ao longo dos anos que fizeram com que a compilação falhasse em ambientes multithread. Eu recomendaria fazer a compilação em um bloco sincronizado.