Scala Lazy Values:パフォーマンスペナルティ? threadsafe? [複製
-
28-09-2019 - |
質問
Scalaは、怠zyな値の定義を許可します
lazy val maybeUnusedValue = someCostlyInitialization
どこ someCostlyInitialization
の最初の使用でのみ評価されます maybeUnusedValue
. 。つまり、せいぜい一度評価されます、そして maybeUnusedValue
使用されることはありません。また、まったく評価されません。
このスレッドセーフですか?これのパフォーマンスへの影響は何ですか?これがthreadsafeである場合、何らかのsyncronization / feats java揮発性を何らかの方法で使用する必要があります。残念ながら SCALA言語仕様 これについては何も言いません。
解決
ダブルチェックロックを使用してスレッドセーフになります http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html 明らかに、これは、怠zyなバルズへのアクセスが怠zyなバルよりも遅いことを意味します。
他のヒント
更新:おっと、Vasilが指摘したように、質問は別のスレッドのコピーであり、それが起こるように、この答えもそうです。
私はこのクラスを受講しました:
class Foo {
lazy val test = "hi"
}
コンパイルされて逆コンパイルされた(JD-GUIを使用):
public class Foo
implements ScalaObject
{
private String test;
public volatile int bitmap$0;
public String test()
{
if (
(this.bitmap$0 & 0x1) == 0);
synchronized (this)
{
if (
(this.bitmap$0 & 0x1) == 0) {
this.test = "hi"; this.bitmap$0 |= 1; } return this.test;
}
}
}
ご覧のとおり、揮発性変数でダブルチェックパラダイムを使用しています。だから私はそれが安全だと思う
所属していません StackOverflow