与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
}
}
}
答案 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是线程安全的:
此类的实例是不可变的,并且可供多个并发线程使用。