栈的相关面试题
①举例栈溢出的情况?( StackOverflowError)
比如一个栈是大小是固定了的,当你调用的方法太多,超出了大小限制则会造成StackOverflowError。
还有就是栈的大小可以动态改变,用-Xss改变栈的大小,当尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个outOfMemoryError异常。
②调整栈大小,就能保证不出现溢出吗?
不能,如果是死循环,不管栈的大小是多少都会出现溢出
③分配的栈内存越大越好吗?
不是!栈变大了内存中的剩余空间会变小。会挤压别的结构的生存空间
④垃圾回收是否会涉及到虚拟机栈?
不会。
因为虚拟机栈是个栈,只存在进栈出栈这两个操作
⑤方法中定义的局部变量是否线程安全?
具体问题具体分析;
package cn;
public class test {
/**
* 何为线程安全?
* 只有一个线程可以操作这个数据,那么就是线程安全的。
* 如果有多个线程操作此数据,则此数据是共享数据可能会出现线程安全问题
*/
int num=10;
// builder的声明方式是线程安全的
public static void method1(){
// StringBuilder这个类是线程不安全的,所以用来演示这个例子。
StringBuilder builder = new StringBuilder();
builder.append("#");
builder.append("2");
//........
}
// s2的声明方式是线程不安全的,因为它是从外面传进来的,不光是归method2所有,还可能被别的方法调用
public static void method2( StringBuilder s2){
s2.append("#");
s2.append("2");
//....
}
//这里s1也是线程不安全的,因为返回值可能会被其他的线程调用 修改等。
public static StringBuilder method3(){
StringBuilder s1=new StringBuilder();
s1.append("#;");
s1.append("32313");
return s1;
}
//这里的s1是线程安全的,因为toString()相当于是重新new了一个String,所以返回出去的是新new的值
public static String method4(){
StringBuilder s1=new StringBuilder();
s1.append("#;");
s1.append("32313");
return s1.toString();
}
public static void main(String[] args) {
StringBuilder s=new StringBuilder();
new Thread(()->{
s.append("3213ag");
s.append("gbhsibguw");
}).start();
method2(s);
}
}