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 引用在構造期間溢出的錯誤。