有关逸出的问题

来源:4-1 安全发布对象-发布与逸出

伟少_will

2018-03-20

第二个例子Escape.java中, 看的不是太懂

在6分37秒中说的"包含了对封装实例它隐含的引用",这句话没有听明白

还有就是"造成this引用的溢出"

可能这一章节没有了错误的演示, 所以好像听的不太懂

写回答

1回答

Jimin

2018-03-20

你好,先来看一个实际的例子。

逃逸主要分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。

例如:

public static StringBuffer craeteStringBuffer(String s1, String s2) {

    StringBuffer sb = new StringBuffer();

    sb.append(s1);

    sb.append(s2);

    return sb;

}

StringBuffer sb是一个方法内部变量,上述代码中直接将sb返回,这样这个StringBuffer有可能被其他方法所改变,这样它的作用域就不只是在方法内部,虽然它是一个局部变量,称其逃逸到了方法外部。

甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。

上述代码如果想要StringBuffer sb不逃出方法,可以这样写:

public static String createStringBuffer(String s1, String s2) {

    StringBuffer sb = new StringBuffer();

    sb.append(s1);

    sb.append(s2);

    return sb.toString();

}

不直接返回 StringBuffer,那么StringBuffer将不会逃逸出方法。


在明确了什么是逃逸后,this引用逸出就容易理解了,他主要指一个类发布出去时this引用也被发布出去了,不过这种代码需要在特别复杂的构造过程中才可能出现

1
7
cqnuhy
回复
慕尼黑2567909
同问!
2021-11-08
共7条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程