有关逸出的问题
来源:4-1 安全发布对象-发布与逸出

伟少_will
2018-03-20
第二个例子Escape.java中, 看的不是太懂
在6分37秒中说的"包含了对封装实例它隐含的引用",这句话没有听明白
还有就是"造成this引用的溢出"
可能这一章节没有了错误的演示, 所以好像听的不太懂
1回答
-
你好,先来看一个实际的例子。
逃逸主要分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
例如:
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引用也被发布出去了,不过这种代码需要在特别复杂的构造过程中才可能出现
172021-11-08