Scala STM を試してみる その2

前回に引き続き ScalaSTM を試してみました。

object SampleForSTM2 {
  import scala.concurrent.stm._
  import scala.util.control.Exception.allCatch

  def main (args: Array[String]) {
    doTest(
      "case5" -> case5,
      "case6" -> case6
    )
  }

  def doTest(testCases: (String, () => Unit)*) {
    testCases foreach { testCase =>
      println("--<%s start>--" format testCase._1)
      testCase._2()
      println("--<%s end>--" format testCase._1)
    }
  }

  def case5() = {
    val result = allCatch either atomic { implicit txn =>
        println("start atomic")
        throw new Exception("test exception in atomic.")
        println("end atomic")
    }
    println(result)
  }

  def case6() = {
    val result = allCatch either atomic { implicit txn =>
      println("atomic1")
      retry
      None
    } orAtomic { implicit txn =>
      println("atomic2")
      retry
      None
    } orAtomic { implicit txn =>
      println("atomic3")
      retry
      None
    }
    println(result)
  }
}
--<case5 start>--
start atomic
Left(java.lang.Exception: test exception in atomic.)
--<case5 end>--
--<case6 start>--
atomic1
atomic2
atomic3
Left(java.lang.IllegalStateException: explicit retries cannot succeed because cumulative read set is empty)
--<case6 end>--

case5

当たり前の話ですが、例外はキャッチできるようです。また、例外が発生した時点で atomic に渡したブロックの再評価は行われませんでした。

case6

orAtomic を使用した場合、最後のブロックで retry すると例外が発生します。理由は出力結果の通りです。


後は、速度比較のみ。