Skip to content

Instantly share code, notes, and snippets.

@xuwei-k xuwei-k/Hoge.scala
Created Apr 20, 2015

Embed
What would you like to do?
case class Hoge(x: Int) {
lazy val i = x + 1
lazy val foo = (1 to 10).par.map(_*i)
}
Hoge(1).foo
  • 現状(少なくとも2.11まで)のlazy valはthisでsynchronizedするという実装
  • fooを評価しようとする
  • fooを評価しようとしたスレッドが、synchronizedして、Hogeのインスタンスのロック取得
  • 並列コレクションでなければ、fooとiを評価しようとするスレッドは同じなので問題ない
  • 並列コレクションは、内部で別スレッド作るので、fooを評価しようとするスレッドと、iを評価しようとするスレッドは別物の可能性がある
  • fooを評価しようとしてHogeのインスタンスのロックを保持したままなので、iを評価しようとするスレッドは、ロックがずっと取得できなくてデッドロック
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.