金币交易网站开发,美工做图素材网站,做网站域名选择,南通做外贸网站目录 一、举例栈溢出的情况二、调整栈大小#xff0c;能保证不出现溢出吗#xff1f;三、分配的栈内存越大越好吗#xff1f;四、垃圾回收是否会涉及到虚拟机栈#xff1f;五、方法中定义的局部变量是否存在线程安全问题#xff1f;5.1 说明5.2 代码示例 一、举例栈溢出的… 目录 一、举例栈溢出的情况二、调整栈大小能保证不出现溢出吗三、分配的栈内存越大越好吗四、垃圾回收是否会涉及到虚拟机栈五、方法中定义的局部变量是否存在线程安全问题5.1 说明5.2 代码示例 一、举例栈溢出的情况 1. 当栈的大小是固定不变的不断调用方法栈中不断加入栈帧会出现栈溢出的情况StackOverflowError异常 2. 可以通过-Xss设置栈的大小 3. 如果栈设置为动态变化的当整个内存都占满了没有额外的空间扩容时此时再扩容会出现OutOfMemoryError异常
二、调整栈大小能保证不出现溢出吗 1. 不能保证 2. 例如某个递归方法被调用1000次出现了StackOverflowError此时调整栈大小递归方法被调用3000次才出现异常如果该方法正常情况下最多调用2000次那么调整栈大小是不会出现溢出的 3. 如果是死循环无限递归调用方法时无论怎么调整栈的大小总会有溢出的时候 4. 调大栈的大小只能让StackOverflowError异常来得晚一些
三、分配的栈内存越大越好吗 1. 理论上栈内存分配得越大延长了出现StackOverflowError异常的时间 2. 对于栈本身来说是越大越好但对于其它结构空间是有影响的毕竟内存是固定的栈内存越大线程数会越少
四、垃圾回收是否会涉及到虚拟机栈 1. 不会
五、方法中定义的局部变量是否存在线程安全问题
5.1 说明
1. 如果只有一个线程才可以操作此数据则是线程安全的2. 如果有多个线程操作此数据则此数据是共享数据。不考虑同步机制的话会存在线程安全问题。3. 在方法里定义的变量且变量的生命周期仅限于该方法则该变量是线程安全的4. 如果变量是作为参数传到方法里的或者方法中定义的变量作为返回值给到其它方法调用这两种情况是线程不安全的
5.2 代码示例
package com.learning.stack.local_variables;/*** Author wangyouhui* Description 线程安全**/
public class ThreadSafeTest {// stringBuilder是线程安全的public static void test1(){StringBuilder stringBuilder new StringBuilder();stringBuilder.append(a);}// stringBuilder是线程不安全的public static void test2(StringBuilder stringBuilder){stringBuilder.append(a);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}stringBuilder.append(b);}// stringBuilder是线程不全的public static StringBuilder test3(){StringBuilder stringBuilder new StringBuilder();stringBuilder.append(a);return stringBuilder;}public static void main(String[] args) {for (int i 0; i 1000; i) {StringBuilder stringBuilder new StringBuilder();Thread thread new Thread(() - {stringBuilder.append(c);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}stringBuilder.append(d);});thread.start();test2(stringBuilder);try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(stringBuilder.toString());}}
}