栈的相关面试题


栈的相关面试题

①举例栈溢出的情况?( 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);
    }

}

文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录