Scala STM を試してみる その2
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 すると例外が発生します。理由は出力結果の通りです。
後は、速度比較のみ。