[英]why instance variables are not mandatory to be final in anonymous class with multithreading in java?
在此代码段中,当存在潜在的错误时,为什么Java不会生成编译时错误。 在下面的代码段中,我尝试在新线程内访问实例变量,然后在主线程中将值更改为null。 是否故意不给出编译错误?
public class AnonymousClass {
private Object str = new Object();
public static void main(String[] args) {
AnonymousClass ac = new AnonymousClass();
ac.testMultiThreading();
}
public void testMultiThreading() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("string value " + str.toString());
}
});
System.out.println("value of str before changing " + str.toString());
str = null;
t.start();
System.out.println("value of str after changing " + str.toString());
}
}
从Java的角度来看,程序没有错:
str
,所有这些位置都可以看到。 这是合法的 toString
之前将测试对象为null
,并且如果str
恰好为null
,它将获得NullPointerException
您的程序可能出于多种原因而同时更改实例变量的值。 例如,线程可能想要计算一些值,并将结果放入实例变量中,以便主线程收获。 Java为您提供了安全执行同步工具。 因此,Java编译器没有理由坚持要求实例变量为final
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.