繁体   English   中英

如果解除引用的Java对象启动仍在运行的线程,它仍然会被垃圾收集吗?

[英]Does a dereferenced Java object still get garbage-collected if it started a thread which is still running?

请考虑以下情形:

  • 一个对象myObj在某个函数myFunc 本地实例化。
  • myObj启动一个线程someThread ,它运行一些后台任务,例如从套接字读取。
  • myFunc然后返回,导致myObj被解除引用。

在正常情况下,JVM只会垃圾收集myObj 但是,如果someThread仍在运行,那么情况仍然如此吗?

我知道someThread本身不会是GC,只要它仍在运行,但在我的代码中它还需要访问存储在myObj值,所以我确保myObj在它仍在运行时仍然存在是很重要的。

如果对象没有引用,则该对象仅适用于垃圾回收。 你说someThread需要访问存储在myObj值,这意味着它必须具有对myObj的引用。 这意味着myObj不符合垃圾收集条件,除非someThread也符合条件。

你可以保证一个对象永远不会从你下面收集垃圾,所以这是非常安全的:

void foo() {
    final Object something = new String("I'm alive!");
    new Thread() {
        public void run() {
            try {Thread.sleep(10000);} catch (InterruptedException e) {}
            System.out.println(something);
        }
    }.start();
}

匿名线程引用了something内容,因此在完成匿名线程之前,它不符合垃圾回收的条件。

更具体地说,对于您的示例,这也是安全的:

void foo() {
    new ThreadStartingObject("I'm alive!");
}

class ThreadStartingObject {
    private String message;

    public void ThreadStartingObject(String msg) {
        this.message = msg;
        new Thread() {
            public void run() {
                try {Thread.sleep(10000);} catch (InterruptedException e) {}
                System.out.println(message);
            }
        }.start();
    }
}

表示螺纹匿名内部类具有隐式引用到外this ,即实例ThreadStartingObject 该引用可防止垃圾回收。

暂无
暂无

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

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