Java併發編程 - 安全發佈對象(發佈 & 溢出)

5ba6167d00015abf19201080.jpg (1920×1080)

package com.mmall.concurrency.example.publish;

import com.mmall.concurrency.annoations.NotRecommend;
import com.mmall.concurrency.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@NotThreadSafe
@NotRecommend
public class Escape {

    private int thisCanBeEscape = 0;

    public Escape () {
        new InnerClass();
    }

    private class InnerClass {

        public InnerClass() {
            log.info("{}", Escape.this.thisCanBeEscape);
        }
    }

    public static void main(String[] args) {
        new Escape();
    }
}
  • 發佈對象:使一個對象能夠被當前範圍之外的代碼所使用。
  • 對象溢出:一種錯誤的發佈,當一個對象還沒有構造完成時,就使他被其他線程所見。比如,這個Escape類的構造函數沒有執行完,而他的內部類卻對這個類的封裝實例進行引用,則已經把這個值打印出來了,而未來這個thisCanBeEscape值仍會改變,比如說在 new 內部類之後對 thisCanBeEscape賦值,那麼 log 的值是過期的。這是個 this 引用在構造期間溢出的錯誤。

5d3fa1d50001117819201080.jpg (1920×1080)

  • 詳情見單例模式的演進
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章