赞
踩
线程内的局部变量是否线程安全,取决于该变量是否被多个线程共享使用。
线程安全的局部变量
m1
中,StringBuilder sb
是一个局部变量,仅在方法 m1
内部使用。由于每个线程调用 m1
时都会创建自己独立的 sb
变量,因此 m1
方法中的局部变量 sb
是线程安全的。m2
中,StringBuilder sb
作为参数传递进来,可能会被多个线程同时访问。图中显示在 main
方法中,一个新线程会调用 m2
方法并传入 sb
变量。这种情况下,sb
变量被多个线程共享使用,因此 m2
方法中的局部变量 sb
是线程不安全的。m3
中,StringBuilder sb
虽然是在方法内部创建的局部变量,但方法返回了这个变量的引用。此时,外部方法(例如 main
方法)可以共享和修改这个返回的 sb
变量。如果多个线程调用 m3
方法并使用返回的 sb
变量,也会导致线程不安全。结论
① 栈帧过多导致栈内存溢出,典型的问题:递归调用
② 栈帧过大导致栈内存溢出
①用途和存储内容不同
②线程安全性:
③内存管理:
④存储大小:
⑤内存溢出:
StackOverflowError
,常见原因是递归调用过深或方法调用层次过多,导致栈帧数量过多。OutOfMemoryError
,常见原因是创建了过多的对象,或对象占用的内存过大,导致堆内存耗尽。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。