为什么要限制我们直接使用外部的局部变量呢?
主要原因在于内存模型,我们都知道实例变量在堆上分配的,而局部变量在栈上进行分配,
lambda 表达式运行在一个独立的线程中
,局部变量也属于线程私有,如果肆意的允许 lambda 表达式引用局部变量,可能会存在局部变量以及所属的线程被回收,而 lambda 表达式所在的线程却无从知晓,这个时候去访问就会出现错误,之所以允许引用事实上的 final(没有被声明为 final,但是实际中不存在更改变量值的逻辑),是因为对于该变量操作的是变量副本(
与匿名内部类原理一致
),只有变量值不会被更改,这份副本才有效。
版权声明:本文为weixin_42939612原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。