探索,java线程中使用局部变量:局部变量必须声明为final
2018-03-01 10:35
621 查看
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关键字的目的就是为了保证内部类和外部函数对变量“认识”的一致性
相关文章推荐
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- Java中为什么内部类对外部类局部变量有引用时,外部类局部变量一定要有final?
- java学习——ThreadLocal 线程局部 (thread-local) 变量的使用
- 【JAVA】在线程里使用线程外的变量为什么一定要是final类型
- Java final变量的声明和使用
- 为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?
- 为什么内部类使用的局部变量必须是final而全局变量可以是no-final
- Java接口中的成员变量为什么必须声明为public static final?
- Java中为什么内部类对外部类局部变量有引用时,外部类局部变量一定要有final?
- 为什么局部内部类访问局部变量,局部变量必须声明为final?
- Java接口中的成员变量为什么必须声明为public static final?
- Java中final变量为什么在使用前必须要进行初始化
- 解析——java匿名内部类使用外部变量时,外部变量必须是final
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- Java 内部类中使用局部变量必须是final
- Java 局部内部类访问局部变量必须加final关键字
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- java 内部类 外部局部变量必须 final 原因
- 内部类引用外部类局部变量,外部类局部变量必须是final
- Java中为什么内部类对外部类局部变量有引用时,外部类局部变量一定要有final?