关于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);   
                cyclicBarrier.reset();
            }).start();
        }
    }
}

在匿名内部类中访问局部变量,那么这个局部变量必须用final修饰

为什么需要用final修饰呢?

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


下一篇:控制并发流程