关于final修饰符的一些小坑

关于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);   
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}
这里的tmp如果需要在匿名内部类中使用,那么需要final关键字修饰,在JDK1.8中进行了优化处理,可以不加,但是不允许值发生改变
在匿名内部类中访问局部变量,那么这个局部变量必须用final修饰

为什么需要用final修饰呢?

  1. 因为为了保护数据的一致性,对于基本类型如(int)来说的就是值的一致性,对于引用变量来说的,就是引用地址的一致性
  2. 如果不使用final进行修饰,那么原先的局部变量可以发生变化,那么匿名内部类在引用的时候就会出错
  3. 因为最开始创建匿名内部类后,值是在匿名内部类的构造器中进行赋值传入的,因此后续代码的修改,会导致程序最终结果不一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值