JAVA逃逸分析的原理
2018-03-21 00:00
141 查看
首先非常感谢慕课网_Jimin_老师的回答:
逃逸主要分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
例如:
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将不会逃逸出方法。
逃逸主要分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
例如:
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将不会逃逸出方法。
相关文章推荐
- Java NIO原理图文分析及代码实现
- Java 8 Lambda实现原理分析
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- java中jvm逃逸问题分析
- 关于Java的数据结构HashMap,ArrayList的使用总结及使用场景和原理分析
- Java集合---ConcurrentHashMap原理分析
- JAVA CAS原理深度分析
- JAVA CAS原理深度分析
- Java多线程编程-(14)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析
- JAVA CAS原理深度分析
- Java CAS 原理分析
- Java 线程池执行原理分析
- java CAS原理深度分析
- Java ClassLoader 原理详细分析
- Java Timer 定时任务实现原理及缺陷分析
- JAVA基础之HashMap实现原理及源码分析
- Java 8 动态类型语言Lambda表达式实现原理分析
- 深入分析Java并发中volatile的实现原理
- Java 线程池(ThreadPoolExecutor)原理分析与使用
- java.util.Timer分析源码了解原理