2 qpqpwj qpqpwj 于 2016.09.12 11:13 提问

Java Thread Runnable run

请问 为什么主函数中的User eclipse 会提示修改成 final 修饰
class User {
public void A(){
for (int i = 0; i >0 ; i--) {
System.out.println(i);
}
}
public void B(){
for (int i = 0; i >0 ; i--) {
System.out.println(i);
}
}
}

public class TestThread {
public static void main(String[] args) {
final User u = new User();
Thread t1 = new Thread(new Runnable(){public void run(){u.A();}});
Thread t2 = new Thread(new Runnable(){public void run(){u.B();}});

}

}

2个回答

bdmh
bdmh   Ds   Rxr 2016.09.12 11:15

异步中修改外部对象,会导致不同步,造成数据错误,所以建议你改成final,保证对象是不会被修改的

zhuzige521888
zhuzige521888   2016.09.12 14:51

1.因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。
2.这么写也不会有问题。
Thread t1 = new Thread(new Runnable(){public void run(){User u = new User();u.A();}});
Thread t2 = new Thread(new Runnable(){public void run(){User u = new User();u.B();}});

zhuzige521888
zhuzige521888 new Runnable(){public void run(){u.A();}}这就是一个内部类,User u 是外部变量。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片