局部变量不存在数据竞争的,但是至于原因嘛,就说不清楚了。那它背后的原因到底是怎样的呢?要弄清楚这个,你需要一点编译原理的知识。你知道在 CPU 层面,是没有方法概念的,CPU 的眼里,只有一条条的指令。编译程序,负责把高级语言里的方法转换成一条条的指令。所以你可以站在编译器实现者的角度来思考“怎么完成方法到指令的转换”。
方法是如何被执行的
方法调用的过程想必你已经清楚了,但是还有一个很重要的问题,“CPU 去哪里找到调用方法的参数和返回地址?”如果你熟悉 CPU 的工作原理,你应该会立刻想到:通过 CPU 的堆栈寄存器。CPU 支持一种栈结构。因为这个栈是和方法调用相关的,因此经常被称为调用栈。每个方法在调用栈里都有自己的独立空间,称为栈帧, 每个栈帧里都有对应方法需要的参数和返回地址。当调用方法时,会创建新的栈帧,并压入 调用栈;当方法返回时,对应的栈帧就会被自动弹出。也就是说,栈帧和方法是同生共死 的。
局部变量存哪里?
局部变量的作用域是方法内部,也就是说当方法执行完,局部变量就没用了,局部变量应该和方法同生共死。事实上,局部变量就是放到 了调用栈里。
调用栈与线程
每个线程都有自己独立的调用栈。因为如果不是这样,那两个线程就互相干扰了。