このコードを想定します。
public class Foo {
public static Thread thread;
public String thing = "Thing!!";
public static void main(String[] args) {
new Foo().makeThread();
// <- Foo object may get garbage collected here.
thread.start();
}
private void makeThread() {
thread = new Thread(new Runnable() {
@Override
public void run() {
// !! What if the instance of Foo is long gone?
System.out.println(thing);
}
});
}
}
ここで、一時オブジェクトnew Foo()
は、の匿名実装でThread thread
結合されたインスタンスを利用する静的に保持されたものを作成します。の有効期限が切れた後、ガベージコレクションを取得しますか、それとも内で使用するために存続しますか?どうして?String thing
Runnable
String thing
new Foo()
run()
静的変数からオブジェクトにつながる参照のチェーンがあるため、文字列はthread
、null
または他の何かに設定されるまでガベージコレクションされませんThread
。
参照のチェーンは次のようになります。
static thread
Foo
から派生した匿名クラスのインスタンスを介して作成されたインスタンスを暗黙的に参照しますRunnable
。次に、のインスタンスはFoo
への参照を保持thing
し、オブジェクトがガベージコレクションされないようにします。
Fooのインスタンスが長い間なくなった場合はどうなりますか?
Foo
Thread
オブジェクトからの暗黙の参照によってライブに保たれるため、どこにも行きません。
注:この回答は、String
文字列リテラルから作成されたオブジェクトのインターンの影響を意図的に無視しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加