4

(別のスレッドで可能) ClassA.foobar() メソッドを実行しているとします。そのメソッド内には、try (場合によっては catch)、finally ブロックがあります。

実行がまだ try ブロック (または catch ブロック) の途中であるときに、この ClassA オブジェクト (またはこのスレッド) への最後の参照が失われた場合、このオブジェクト (/スレッド) は、取得する前にガベージコレクションを取得できますか?最終ブロックまで?つまり、オブジェクト (/スレッド) への強い参照がメモリに残っていなくても、finally ブロックの実行は保証されているのでしょうか?

(GC が孤立したライブ スレッドをどのように処理するかはわかりません。)

ダミーの例:

[Some context]
{
    ClassA classA = new ClassA();
     //Point is this instance and a reference to it exists

    class ClassA
    {
        public void foobar()
        {
            try
            {
                classA = null;
                 //Point is that the last reference to this instance is lost,
                 //and that this happens at this point in foobar() execution.
                 //The actual location of this line of code is irrelevant.
            }
            finally
            {
                //some important stuff here!
            }
        }
    }
}
4

1 に答える 1

6

つまり、オブジェクト (/スレッド) への強い参照がメモリに残っていなくても、finally ブロックの実行は保証されているのでしょうか?

はい。finallyブロックはそのようにスキップされません-他のコードも同様です。

実行スレッドは、ガベージ コレクションの意味でのオブジェクトではありません。スレッド自体とそれを表すオブジェクトを区別することが重要ですが、スレッドが終了する前にオブジェクトがガベージ コレクションされるとjava.lang.Threadは思いません。Thread

特に、実行可能なものへの参照やシステム内にまだ何もないスレッドを持つことは完全に可能であり、スレッドは続行できます。例えば:

new Thread(new Runnable() {
    @Override public void run() {
        for (int i = 0; i < 1000; i++) {
             System.out.println(i);
        }
    }
}).start();

スレッドが開始された後、呼び出し元のコードは、作成された匿名クラスのインスタンスまたはThreadオブジェクトへの参照を持ちませんが、それでも 1000 個の数字すべてを出力します。

于 2013-11-04T06:43:07.827 に答える