非同期間で共有して使う、DB等からfetchしてくる値があるけど条件によっては一切参照されない、みたいな時に便利
object Dao {
lazy val get = {
println("dbアクセス処理とか…")
"get value"
}
}
(1 to 10).par.foreach { i =>
val v = Dao.get
println(s"$i < $v")
}
/* =>
dbアクセス処理とか…
7 < get value
2 < get value
1 < get value
9 < get value
5 < get value
6 < get value
4 < get value
8 < get value
3 < get value
10 < get value
*/
lazy val
はコンパイル後に synchronized
ブロックになるので非同期での参照に使える
当然だけど初回アクセスはlockされるのでデータの取得完了までは待ちが発生する
なので( synchronized
はタイムアウト設定とかできないので) Duration.Inf
とかしちゃう処理に使わないようにだけ注意しよう
おまけ
cats使うと更に簡潔に書けます( Eval.later
は会社の人に教えてもらった 😊)
val get = Eval.later {
println("dbアクセス処理とか…")
"get value"
}
(1 to 10).par.foreach { i =>
val v = get.value
println(s"$i < $v")
}