Java Regex Thread安全吗?

2022-08-31 09:21:32

我有一个函数,它使用和a来搜索字符串列表的模式。Pattern#compileMatcher

此函数在多个线程中使用。每个线程都将在创建线程时传递一个唯一的模式。线程和模式的数量是动态的,这意味着我可以在配置期间添加更多的线程和线程。Pattern#compilePattern

如果它使用正则表达式,我需要在这个函数上放一个吗?java线程中的正则表达式是安全的吗?synchronize


答案 1

是的,来自 Pattern 类的 Java API 文档

此(模式)类的实例是不可变的,并且可以安全地供多个并发线程使用。Matcher 类的实例对于此类使用是不安全的。

如果您正在查看以性能为中心的代码,请尝试使用 reset() 方法重置 Matcher 实例,而不是创建新实例。这将重置 Matcher 实例的状态,使其可用于下一个正则表达式操作。实际上,正是在 Matcher 实例中维护的状态导致它对并发访问不安全。


答案 2

Java 中正则表达式的线程安全

总结:

Java 正则表达式 API 旨在允许在多个匹配操作之间共享单个已编译的模式。

您可以安全地从不同的线程对同一模式调用Pattern.matcher(),并安全地同时使用匹配器。Pattern.matcher() 可以安全地构建无需同步的匹配器。尽管该方法不是同步的,但在 Pattern 类的内部,在构造模式后始终设置一个名为 compiled 的易失性变量,并在调用 matcher() 开始时读取。这将强制任何引用 Pattern 的线程正确“看到”该对象的内容。

另一方面,您不应该在不同的线程之间共享匹配器。或者至少,如果您曾经这样做过,则应使用显式同步。