我是Scala的新手,想编写一些多线程代码并使用模式匹配,想知道是否能将模式匹配代码视为原子操作。
例如:
有可能执行过程如下:
1. 主线程到达“match global_point”代码,发现*global_point*不是类型为TwoDim的对象,暂停(返回调度程序)。 2. 生成的线程更改*global_point*的类型为TwoDim。 3. 主线程返回,发现*global_point*不是类型为OneDim的对象,认为没有匹配到*global_point*,并引发NoMatch异常。
Scala内部是否避免这种类型的执行?如果是的话,怎么做?匹配是否会对对象进行快照,然后尝试将其与模式进行匹配?快照深度是否有限制(匹配模式可能很复杂和嵌套)?
例如:
abstract class MyPoint
case class OneDim(x : Int) extends MyPoint
case class TwoDim(x : Int, y : Int) extends MyPoint
var global_point : MyPoint = new OneDim(7)
spawn {
Thread.sleep(scala.util.Random.nextInt(100))
global_point = new TwoDim(3, 9)
}
Thread.sleep(scala.util.Random.nextInt(100))
match global_point {
case TwoDim(_, _) => println("Two Dim")
case OneDim(_) => println("One Dim")
}
有可能执行过程如下:
1. 主线程到达“match global_point”代码,发现*global_point*不是类型为TwoDim的对象,暂停(返回调度程序)。 2. 生成的线程更改*global_point*的类型为TwoDim。 3. 主线程返回,发现*global_point*不是类型为OneDim的对象,认为没有匹配到*global_point*,并引发NoMatch异常。
Scala内部是否避免这种类型的执行?如果是的话,怎么做?匹配是否会对对象进行快照,然后尝试将其与模式进行匹配?快照深度是否有限制(匹配模式可能很复杂和嵌套)?