并发编程 调用栈与局部变量

本文将对调用栈做简单说明,并解释局部变量为什么没有并发问题。

一、方法如何执行?

如果在主程序中调用某个子方法,具体流程可以细分为:

  • 首先记住主程序中调用位置的地址(返回地址)
  • 找到子方法的地址
  • 跳转至子方法,执行代码
  • 执行完成后,根据返回地址,返回主程序

二、调用栈

调用栈,又被称为执行栈,是存储 “有关正在运行的方法的消息” 的栈。

  • 每个方法在调用栈中都会有自己的独立空间,称为栈帧
  • 栈帧中会存储对应方法的参数
  • 栈帧中会存储对应方法的返回地址
  • 当调用方式时,方法对应的栈帧会被创建,并压入调用栈
  • 当方法执行结束时,对应的栈帧就会被自动弹出

例如:

例如,有三个方法 A、B、C,他们的调用关系是 A->B->C(A 调用 B,B 调用 C),在运行时,会构建出下面这样的调用栈。

三、调用栈与线程

每个线程都有自己独立的调用栈

因为如果不是这样,各个线程调用方法都可能产生干扰。

四、局部变量的存储

局部变量会被存储在调用栈中。

因此,方法执行结束后,局部变量会和栈帧一起被销毁。

因此,局部变量并不存在并发问题,因此它们独立存放在不同的调用栈中。

参考

  • Java 并发编程实战