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 引用在构造期间溢出的错误。