JAVA线程-为什么局部变量是线程安全的

方法是如何被执行

例如下面的程序

1
2
3
int a = 7
int[] b = fibonacci(a);
int[] c = b;

当jvm调用fibonacci(a)时,通过cpu的寄存器找到方法的地址。cpu支持一种栈结构,他和方法息息相关,所以一般叫做调用栈。
栈这种数据结构的特点是后进先出,所以当一个遇到方法嵌套时候比如a–>b–>c,那么入栈的时候就是c–>b–>a,执行顺序也是c–>b–>a。

方法中的局部变量

方法实际上是以栈帧为单位入栈的,一个方法从入口到返回都在一个栈帧中,栈帧和方法的生命周期是一样的,当方法结束,栈帧也就失效了,而方法中的局部变量都是保存在栈帧中的,他的生命周期也是在方法内部。且为了线程之间不相互干扰,每个线程都有一个独立的栈帧。综上,栈帧是线程安全的。

这种方式有个名词叫线程封闭,即仅在单线程内访问数据,不共享就没有线程安全的问题。例如:我们常用的数据库连接池,connection的方法并没有声明线程安全,我们在使用中都是在一个方法内获取conenection,查询数据,关闭connecton,这这种线程封闭方式来解决线程安全的问题。