探索,java线程中使用局部变量:局部变量必须声明为final

时间:2021-12-07 18:23:02

java内部类访问局部变量时局部变量必须声明为final,同样,在线程中使用局部变量时,需将局部变量声明为final。

public class Thread2 {

    private static int num = 0;

    public static synchronized void printNum(String tag){
        try {
            if(tag.equals("a")){
                num = 100;
                System.out.println("tag a ,set num over");
            }else {
                num = 200;
                System.out.println("tag b ,set num over");
            }
            System.out.println("tag"+tag + "num:"+num);
        }catch (Exception e){
            e.printStackTrace();
        }

    }


    public static void main(String[] args) {

        //两个不同对象
        final Thread2 m1 = new Thread2();
        final Thread2 m2 = new Thread2();

        Thread t1 = new Thread(new Runnable() {
            public void run() {
                m1.printNum("a");
            }
        });

        Thread t2 = new Thread(new Runnable() {
            public void run() {
                m2.printNum("b");
            }
        });

        t1.start();
        t2.start();

    }
}

原因:
编译这个类后发现产生了3个class文件,编译后的内部类的构造方法的里面,传了对应的外部类的引用和所有局部变量的形参。
由于这些工作是在编译时进行的,JAVA虚拟机并没有什么所谓的内部类的概念,在JAVA虚拟机看来,该内部类和外部类是两个独立的class文件。
final关键字的目的就是为了保证内部类和外部函数对变量“认识”的一致性