并发编程 调用栈与局部变量
本文将对调用栈做简单说明,并解释局部变量为什么没有并发问题。
一、方法如何执行?
如果在主程序中调用某个子方法,具体流程可以细分为:
- 首先记住主程序中调用位置的地址(返回地址)
- 找到子方法的地址
- 跳转至子方法,执行代码
- 执行完成后,根据返回地址,返回主程序
二、调用栈
调用栈,又被称为执行栈,是存储 “有关正在运行的方法的消息” 的栈。
- 每个方法在调用栈中都会有自己的独立空间,称为栈帧
- 栈帧中会存储对应方法的参数
- 栈帧中会存储对应方法的返回地址
- 当调用方式时,方法对应的栈帧会被创建,并压入调用栈
- 当方法执行结束时,对应的栈帧就会被自动弹出
例如:
例如,有三个方法 A、B、C,他们的调用关系是 A->B->C(A 调用 B,B 调用 C),在运行时,会构建出下面这样的调用栈。
三、调用栈与线程
每个线程都有自己独立的调用栈。
因为如果不是这样,各个线程调用方法都可能产生干扰。
四、局部变量的存储
局部变量会被存储在调用栈中。
因此,方法执行结束后,局部变量会和栈帧一起被销毁。
因此,局部变量并不存在并发问题,因此它们独立存放在不同的调用栈中。
参考
- Java 并发编程实战