考虑以下情况:
myObj
中,对象myFunc
在本地实例化 。myObj
启动一个运行一些后台任务的线程someThread
,例如从插座中读取。myFunc
然后返回,导致myObj
被解除引用。在正常情况下,JVM只会垃圾收集myObj
。但是,如果someThread
仍在运行,情况仍然如此吗?
我了解someThread
本身 不 只要它仍然在运行,但是在我的代码中它还需要访问值存储在myObj
中,因此我必须确保myObj
在其仍在运行时仍然存在。
答案 0 :(得分:3)
如果对象没有对它的引用,则该对象仅适用于垃圾回收。您说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
的实例。该引用可防止垃圾回收。