一个对象只有在没有对它的引用时才有资格进行垃圾回收。您说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
。该引用防止垃圾收集。