1.举例栈溢出的情况?(StackOverflowError)
- 通过 -Xss 设置栈的大小
- 递归很容易出现栈溢出
2.举例栈溢出的情况?(StackOverflowError)
- 不能保证不出现溢出,只能让栈溢出出现的时间晚一点,不可能不出现
3.分配的栈内存越大越好么?
- 不是,一定时间内降低了栈溢出的概率,但是会挤占其它的线程空间,因为整个虚拟机的内存空间是有限的
4.垃圾回收是否涉及到虚拟机栈?
- 不涉及
5.方法中定义的局部变量是否线程安全? 何为线程安全?
- 如果只有一个线程才可以操作此数据,则必是线程安全的。
- 如果有多个线程操作此数据,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题。
具体问题具体分析:
- 如果对象是在内部产生,并在内部消亡,没有返回到外部,那么它就是线程安全的,反之则是线程不安全的。
/**
* 面试题:
* 方法中定义的局部变量是否线程安全?具体情况具体分析
*
* 何为线程安全?
* 如果只有一个线程才可以操作此数据,则必是线程安全的。
* 如果有多个线程操作此数据,则此数据是共享数据。如果不考虑同步机制的话,会存在线程安全问题。
*/
public class StringBuilderTest {
//s1的声明方式是线程安全的,因为s1只在方法内部操作,属于局部变量
public static void method1(){
//StringBuilder:线程不安全
StringBuilder s1 = new StringBuilder();
s1.append("a");
s1.append("b");
//...
}
//sBuilder通过参数传递方法内,存在线程不安全的问题
public static void method2(StringBuilder sBuilder){
sBuilder.append("a");
sBuilder.append("b");
//...
}
//操作s1之后,将s1作为返回值返回,这样可能被其他线程所调用,所以存在线程不安全的问题
public static StringBuilder method3(){
StringBuilder s1 = new StringBuilder();
s1.append("a");
s1.append("b");
return s1;
}
//s1的操作:是线程安全的,因为String是线程安全的
public static String method4(){
StringBuilder s1 = new StringBuilder();
s1.append("a");
s1.append("b");
return s1.toString();
}
public static void main(String[] args) {
StringBuilder s = new StringBuilder();
new Thread(() -> {
s.append("a");
s.append("b");
}).start();
method2(s);
}
}