为什么lambda引用外部变量需要final修饰?

     在一个方法内部使用lambda表达式,如果表达式中操作了外部方法的局部变量,需要将外部方法的局部变量定义成final类型的,为什么会这样?带着在这个问题网上搜了一下多种答案,也没说太明白。最近看了JVM相关的内容以后突然想明白了这个问题。

    每个方法在执行的时候都会在线程栈中开辟一块空间创建一个栈帧,方法的执行实际就是栈帧的入栈出栈的过程。栈帧中包含局部变量表,操作数栈,动态连接,方法出口等。外部方法的局部变量(假如有一个局部变量p)就保存在所在栈帧(为了方便叫栈帧A)的局部变量表中,而lambda表达式实际上就是一个匿名内部类的接口实现方法,执行的时候需要在线程栈中创建一个新的栈帧(栈帧B)。不同栈帧之间的局部变量表是独享的,所以栈帧B中的变量p实际上是对外部变量的一个私有拷贝。为了保证程序的正确性就要求这个被应用的局部变量需要定义成final的。假如变量p不要求是final的就会出现栈帧A和栈帧B中该变量值不一样的情况。这就跟我们预期的不一致了。导致程序不正确。

以上就是我想到的一个原因,可能还有别的原因,也可能我知识水平有限理解的不正确,如果哪里有问题还请留言指正。

 

 

 

你可能感兴趣的:(java)