匿名类的内存后果

Beh*_*nil 1 java multithreading

假设我有一个如下代码

class XXX {
    private Date date = new Date();    

    public void doSomething() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                // do a long running operation and use the date variable
            }
        }).start();
     }

}
Run Code Online (Sandbox Code Playgroud)

我有一个XXX类的实例,我在上面调用doSomething().没有其他代码再次引用XXX实例.

我的问题是:当启动的线程正在运行时,GC是否允许从堆中删除XXX实例?是否允许GC从堆中删除日期实例?

据我所知,当匿名类使用局部变量时,其值将通过编译器创建的构造函数进行复制.但是对于像上面这样的封闭类的实例字段也是如此吗?如果是,那么xxx实例可能被垃圾收集.

请详细说明一下.

Sot*_*lis 12

表达方式

new Runnable() {
    @Override
    public void run() {
        // do a long running operation and use the date variable
    }
}
Run Code Online (Sandbox Code Playgroud)

在实例方法中,将生成一个实现的匿名内部类的实例Runnable.因为实例是内部类,所以它具有对外部实例(实例)的XXX引用.

Threadstart()将立即开始执行Runnable#run()在一个新线程的代码.因此,Runnable不能GC.因此,Runnable实例引用的任何对象都不能被GC,即.该XXX实例.

  • +1 Runnable将有一个名为`this $ 0`的字段,您可以在调试器中看到该字段引用外部类实例.顺便说一句,如果你创建一个名为"this $ 0"的字段,只是为了看看会发生什么;)你会得到一个名为"this $$ 0"的字段. (2认同)