前言
本篇文章说一个比较简单的东西,就是局部变量为什么是线程安全的,对于熟悉JVM的开发者来说这个问题可以忽略不计。所以本篇文章作为知识回顾和扩展。
正文
本系列文章一直说的都是并发编程,即多个线程同时访问共享变量的时候,会导致并发问题,那么在Java语言里,是不是所有变量都会是共享变量呢
局部变量
比如我们看下面这个fibonacci()方法,会根据传入的参数n,返回1到n的斐波那契数列,斐波那契数列数列类似这样:1、1、2、3、5、8...,即第一项和第二项是1,第三项开始,每一项等于前俩项之和,所以方法如下:
int[] fibonacci(int n) { // 创建结果数组 int[] r = new int[n]; // 初始化第一、第二个数 r[0] = r[1] = 1; // ① // 计算2..n for(int i = 2; i < n; i++) { r[i] = r[i-2] + r[i-1]; } return r; } 复制代码
假如这时有多个线程来调用fibonacci()这个方法时,数组r是否存在数据竞争呢
很多人都知道这里的r是方法的局部变量,是不存在数据竞争的,至于原因,我们就来梳理一下。
方法是如何被执行
想搞明白这个问题,必须了解一些编译原理的知识或者JVM的知识。在CPU层面,是没有方法概念的,在CPU眼里,只有一条条的指令。编译程序,负责把高级语言里的方法转换为一条条指令,所以这时可以站在编译器实现者的角度来思考:怎么完成方法到指令的转换。
我们先