LoginSignup
0
0

More than 5 years have passed since last update.

scalaのlazy valが非同期処理間で共有する小さなキャッシュを作るのに便利だよって話

Last updated at Posted at 2018-06-01

非同期間で共有して使う、DB等からfetchしてくる値があるけど条件によっては一切参照されない、みたいな時に便利 :rabbit:

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")
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0