繁体   English   中英

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

[英]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为您提供了安全执行同步工具。 因此,Java编译器没有理由坚持要求实例变量为final

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM