Pregunta

  

Duplicar posibles:
   ¿Cuál es la (oculto) el costo de Val perezoso? (Scala)

Scala permite la definición de los valores de descanso

lazy val maybeUnusedValue = someCostlyInitialization

donde se evalúa someCostlyInitialization sólo en el primer uso de maybeUnusedValue. Es decir, se evalúa como máximo una vez, y si maybeUnusedValue nunca se utiliza, que es también no se evaluaron en absoluto.

¿Es esta multi-hilo? ¿Cuáles son las implicaciones de rendimiento de esta? Si esto es ser multi-hilo, tiene que usar algún tipo de sincronización / utilizar Java volátil de alguna manera. Por desgracia, la href="http://www.scala-lang.org/node/198" rel="nofollow noreferrer"> especificación del lenguaje no dice nada acerca de esto.

Otros consejos

ACTUALIZACIÓN: OOPS, como Vasil señaló, la cuestión es una copia de otro hilo, y como sucede, por lo que es esta respuesta.

Tomé esta clase:

class Foo {
  lazy val test = "hi"
}

Compilado y descompilado (con 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;
    }
  }
}

Como se puede ver que está utilizando el paradigma de retención doble con una variable volátil. Así que creo que es seguro

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top