关于final修饰符的一些小坑
今天在测试JUC包的CyclicBarrier方法的时候,遇到一个关于jfinal的问题
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("运行到最后");
});
for (int i = 0; i < 7; i++) {
final int tmp = i;
new Thread(()->{
//这里引用tmp 需要tmp是final修饰的 在JDK1.8之后,不使用final也可以,但tmp的值不能改变,因为JDK1.8在编译的时候做了处理
System.out.println(tmp);
cyclicBarrier.reset();
}).start();
}
}
}
在匿名内部类中访问局部变量,那么这个局部变量必须用final修饰
为什么需要用final修饰呢?
- 因为为了保护数据的一致性,对于基本类型如(int)来说的就是值的一致性,对于引用变量来说的,就是引用地址的一致性
- 如果不使用final进行修饰,那么原先的局部变量可以发生变化,那么匿名内部类在引用的时候就会出错
- 因为最开始创建匿名内部类后,值是在匿名内部类的构造器中进行赋值传入的,因此后续代码的修改,会导致程序最终结果不一致