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

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

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

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

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

3 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

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


class LazyTest {

  lazy val msg = "Lazy"

}

被編譯為等效于以下Java代碼的內容:


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;

  }


}



查看完整回答
反對 回復 2019-12-12
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

使用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值刷新到內存中。



查看完整回答
反對 回復 2019-12-12
  • 3 回答
  • 0 關注
  • 671 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號