【问题标题】:Is scalas pattern matching regex thread safe?scalas模式匹配正则表达式线程安全吗?
【发布时间】:2011-12-18 15:33:48
【问题描述】:

类似于Is Java Regex Thread Safe?,我想知道scala regex 的这种用法是否真的是线程安全的?多个线程是否可以在同一个对象 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
     }
  }
}

【问题讨论】:

    标签: regex scala


    【解决方案1】:

    有不止一个类。它分解为:

    • 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 的线程安全实例。

    【讨论】:

    • 那又怎样?您认为方法 m 是否是线程安全的?我认为是,因为 Match 对象和 MatchIterator 对象不被调用 m 的线程共享。
    • @StefanEndrullis 我认为上面调用 m 是安全的,因为你提到的原因。
    【解决方案2】:

    由于 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)
    

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

    这个类的实例是不可变的,并且可以安全地被多个并发线程使用。

    【讨论】:

    • 请记住,尽管Pattern 是线程安全的,但从Pattern 获得的任何Matcher 实例都不是而且必须被视为线程安全的。不过 OPs 代码是安全的。
    • 假设我创建了一个Matcher,然后将它传递给多个线程。每个线程创建自己的 Matcher 的 clone() 并且只使用克隆是否是线程安全的?
    猜你喜欢
    • 2017-11-27
    • 2010-11-24
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多