为什么在java中使用多线程的匿名类中,实例变量不是强制性的?

时间:2018-01-18 17:05:35

标签: java multithreading

在此代码片段中,为什么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());
    }
}

1 个答案:

答案 0 :(得分:2)

从Java的角度来看,该程序没有任何问题:

  • 您的程序从代码中的三个位置访问str,所有这些都可以看到它。这是合法的
  • 在调用null之前,toString测试对象不需要您的程序,如果NullPointerException恰好是{{1},它将获得str }}
  • Java编译器无法分析程序的线程安全性。这是程序员的责任。

您的程序可能有多种原因可以同时更改实例变量的值。例如,线程可能想要计算某个值,并将结果放入要收集的主线程的实例变量中。 Java为您提供了安全执行的同步工具。因此,Java编译器没有理由坚持实例变量为null