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

时间:2011-10-31 10:39:15

标签: regex scala

Is 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
     }
  }
}

2 个答案:

答案 0 :(得分:12)

有多个班级。它分解为:

  • scala.util.matching.Regex 取决于java.util.regex.Pattern,因此,根据JavaDoc,线程安全。
  • scala.util.matching.Regex.Match 取决于java.util.regex.Match,因此,根据JavaDoc,不是线程安全的
  • scala.util.matching.Regex.MatchIterator 是可变的,包含java.util.regex.Match,所以不是线程安全的
  • scala.util.matching.Regex.MatchData 在技​​术上是线程安全的,但它只作为上述两个类的一部分出现,因此您将找不到MatchData的线程安全实例。

答案 1 :(得分: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)

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

  

此类的实例是不可变的,并且可供多个并发线程使用。