オブジェクトへの参照がない場合にのみ、オブジェクトはガベージコレクションの対象になります。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
ます。その参照はガベージコレクションを防ぎます。