Scala faul Werte: Leistungseinbuße? THREAD? [Duplikat]
-
28-09-2019 - |
Frage
Mögliche Duplizieren:
Was ist die (versteckten) Kosten für faule val? (Scala)
Scala erlaubt die Definition von faulen Werte
lazy val maybeUnusedValue = someCostlyInitialization
Dabei gilt someCostlyInitialization
nur auf der ersten Verwendung von maybeUnusedValue
ausgewertet wird. Das heißt, es höchstens einmal ausgewertet wird, und wenn maybeUnusedValue
nie verwendet wird, wird es auch überhaupt nicht bewertet.
Ist das THREAD? Was sind die Auswirkungen auf die Leistung dieser? Wenn dies THREAD sein, hat es eine Art von syncronization verwenden / verwenden Java volatil in gewisser Weise. Leider ist die Scala Sprachspezifikation nichts dazu sagt.
Lösung
Es ist Thread-sicher mit doppelseitiger checked Verriegelung http://code-o-matic.blogspot.com/2009/05/double-checked-locking-idiom-sweet-in.html Offensichtlich bedeutet dies, dass Zugriff auf faule vals ist langsamer als nicht-faulen.
Andere Tipps
UPDATE: OOPS, als Vasil wies darauf hin, die Frage ist eine Kopie von einem anderen Thread, und wie es geschieht, ist so diese Antwort.
Ich habe diese Klasse:
class Foo {
lazy val test = "hi"
}
Zusammengestellt und dekompilierten (mit 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;
}
}
}
Wie Sie sehen es die doppelte Kontrolle Paradigma mit einer flüchtigen Variable verwendet. Also ich denke, es ist sicher