Skip to content

Instantly share code, notes, and snippets.

@xuwei-k
Created April 20, 2015 09:41
Show Gist options
  • Save xuwei-k/7b2be9957222bcb8f184 to your computer and use it in GitHub Desktop.
Save xuwei-k/7b2be9957222bcb8f184 to your computer and use it in GitHub Desktop.
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