Безопасно ли сопоставлять шаблон скаля с потоком регулярных выражений? - PullRequest
9 голосов
/ 31 октября 2011

Похоже на Является ли 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
     }
  }
}

Ответы [ 2 ]

12 голосов
/ 31 октября 2011

Существует более одного класса.Он разбивается на:

  • 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.
7 голосов
/ 31 октября 2011

Поскольку поддержка Scala для регулярных выражений основана на java.util.regex.Pattern, и поскольку экземпляры этого класса являются поточно-ориентированными, я думаю, что ответ таков: yes :

Используется java.util.regex.Pattern:

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

  import Regex._

  /** The compiled pattern */
  val pattern = Pattern.compile(regex)

Согласно JavaDoc для Pattern, java.util.regex.Pattern является потокобезопасным:

Экземпляры этого класса являются неизменными и безопасны для использования несколькими параллельными потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...