scalas模式匹配正则表达式线程安全吗?

Ido*_*mir 10 regex scala

Java Regex Thread Safe类似,我想知道scala正则表达式的这种用法是否真的是线程安全的?多个线程是否能够在同一个对象M上调用m而不会在结果中相互干扰?

object R {
  val pat = """a(\d)""".r
}

class M {

  def m(s: String): Option[Int] = {
     s match {
       case R.pat(i) => Some(i.toInt)
       case _ => None
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 13

有不止一个班级.它分解为:

  • scala.util.matching.Regex 要看java.util.regex.Pattern,所以,根据JavaDoc中,线程安全的.
  • scala.util.matching.Regex.Matchjava.util.regex.Match因此,根据JavaDoc,它 依赖于线程安全.
  • scala.util.matching.Regex.MatchIterator 是可变的,包含java.util.regex.Match,所以不是线程安全的.
  • scala.util.matching.Regex.MatchData 在技​​术上是线程安全的,但它只出现在上面两个类的一部分,所以你将找不到线程安全的实例MatchData.


Wil*_*ger 7

由于Scala对正则表达式的支持建立在java.util.regex.Pattern之上,并且由于该类的实例是线程安全的,我想答案是:是的:

它使用java.util.regex.Pattern:

class Regex(regex: String, groupNames: String*) extends Serializable {

  import Regex._

  /** The compiled pattern */
  val pattern = Pattern.compile(regex)
Run Code Online (Sandbox Code Playgroud)

根据JavaDoc on Pattern,java.util.regex.Pattern是线程安全的:

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