gpt4 book ai didi

scala - 为什么在抛出异常时 Scala 中的原子 block 会运行两次?

转载 作者:行者123 更新时间:2023-12-01 00:17:58 24 4
gpt4 key购买 nike

代码:

object Blub {
import scala.concurrent.stm._
val last = Ref("none")

def bla() = atomic { implicit txn =>
last() = "outer"
try {
atomic { implicit txn =>
last() = "inner"
println(last())
throw new RuntimeException
}
} catch {
case _: RuntimeException =>
}
}

def main(args: Array[String]): Unit = {
bla()
println("Result: "+last.single())
}
}

输出:
inner  
inner
Result: outer

谁能解释为什么内部原子块运行两次?我知道它由于异常而回滚,因此是最终结果。但我不明白为什么它第二次运行代码。

最佳答案

底部this page在 ScalaSTM 文档上有这样的说法:

To make nesting very cheap, ScalaSTM tries to flatten all of the nesting levels together into a single top-level transaction. If an inner transaction throws an exception then there isn’t enough information to perform the partial rollback, so ScalaSTM restarts the entire transaction in a mode that does exact nesting. This optimization is called subsumption.



那么会发生什么:
  • 整个事情都试图作为“扁平化”交易
  • last设置为 "outer"
  • last设置为 "inner"
  • "inner"已打印
  • 内部原子块抛出异常,外部块没有
  • ScalaSTM 不知道如何仅回滚内部事务,因为它运行“扁平化”,因此它回滚整个事物( last 现在回到 "none" )并重试“非扁平化”
  • last设置为 "outer"
  • last设置为 "inner"
  • "inner已打印
  • 内部原子块抛出异常,被外部块
  • 捕获
  • 这次因为是非扁平化的,所以只能回滚内部块,last设置回 "outer" .
  • 关于scala - 为什么在抛出异常时 Scala 中的原子 block 会运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50989565/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com