- 現状(少なくとも2.11まで)のlazy valはthisでsynchronizedするという実装
- fooを評価しようとする
- fooを評価しようとしたスレッドが、synchronizedして、Hogeのインスタンスのロック取得
- 並列コレクションでなければ、fooとiを評価しようとするスレッドは同じなので問題ない
- 並列コレクションは、内部で別スレッド作るので、fooを評価しようとするスレッドと、iを評価しようとするスレッドは別物の可能性がある
- fooを評価しようとしてHogeのインスタンスのロックを保持したままなので、iを評価しようとするスレッドは、ロックがずっと取得できなくてデッドロック
Created
April 20, 2015 09:41
-
-
Save xuwei-k/7b2be9957222bcb8f184 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
case class Hoge(x: Int) { | |
lazy val i = x + 1 | |
lazy val foo = (1 to 10).par.map(_*i) | |
} | |
Hoge(1).foo |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment