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)

  • 详情见单例模式的演进
发布了1005 篇原创文章 · 获赞 1889 · 访问量 89万+

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/105506795