第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Scala的懶惰val的(隱藏)成本是多少?

Scala的懶惰val的(隱藏)成本是多少?

波斯汪 2019-10-25 11:16:06
Scala的一個便捷功能是lazy val,其中a的求值val被延遲到必要時(首次訪問時)。當然,lazy val必須有一些開銷-Scala必須跟蹤某個值是否已經(jīng)被評估以及評估是否必須同步,因為多個線程可能會嘗試同時首次訪問該值。-的確切成本是多少lazy val-是否存在與boolean關(guān)聯(lián)的隱藏布爾標志lazy val以跟蹤是否已被評估,確切地同步了什么,還有更多成本嗎?另外,假設(shè)我這樣做:class Something {    lazy val (x, y) = { ... }}這與擁有兩個單獨的lazy vals 是相同的x,y或者對于該對我僅獲得一次開銷(x, y)嗎?
查看完整描述

3 回答

?
慕哥9229398

TA貢獻1877條經(jīng)驗 獲得超6個贊

這是從scala郵件列表中獲取的,并lazy根據(jù)Java代碼(而非字節(jié)碼)提供了實現(xiàn)細節(jié):


class LazyTest {

  lazy val msg = "Lazy"

}

被編譯為等效于以下Java代碼的內(nèi)容:


class LazyTest {

  public int bitmap$0;

  private String msg;


  public String msg() {

    if ((bitmap$0 & 1) == 0) {

        synchronized (this) {

            if ((bitmap$0 & 1) == 0) {

                synchronized (this) {

                    msg = "Lazy";

                }

            }

            bitmap$0 = bitmap$0 | 1;

        }

    }

    return msg;

  }


}


查看完整回答
反對 回復(fù) 2019-10-25
?
滄海一幻覺

TA貢獻1824條經(jīng)驗 獲得超5個贊

使用Scala 2.10,像這樣的惰性值:


class Example {

  lazy val x = "Value";

}

被編譯為類似于以下Java代碼的字節(jié)代碼:


public class Example {


  private String x;

  private volatile boolean bitmap$0;


  public String x() {

    if(this.bitmap$0 == true) {

      return this.x;

    } else {

      return x$lzycompute();

    }

  }


  private String x$lzycompute() {

    synchronized(this) {

      if(this.bitmap$0 != true) {

        this.x = "Value";

        this.bitmap$0 = true;

      }

      return this.x;

    }

  }

}

請注意,位圖由表示boolean。如果添加另一個字段,則編譯器將增加該字段的大小,使其能夠表示至少2個值,即表示為byte。這僅適用于大量課程。


但是您可能想知道為什么這可行?進入同步塊時,必須清除線程本地緩存,以便將非易失性x值刷新到內(nèi)存中。這篇博客文章給出了解釋。


查看完整回答
反對 回復(fù) 2019-10-25
  • 3 回答
  • 0 關(guān)注
  • 789 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號