3

私がstop-the-world GCを使用し、finalize()メソッドでいくつかの処理を行うと、すべてのスレッドが中断されていると仮定して、何でもできますし、スレッドはリソースと競合する私はGCのスレッドを除いて?排他ロックとしてファイナライズを使用する

ない
+2

*「スレッドは競争することはできません」* - 私は貧しい小さなアプリケーションスレッドが大きな意味を持つ古いGCスレッドが終了するのを待ってコーナーで震えていることを想像することができます:-) –

答えて

4

いいえ、実際にも、同時に実行される複数のファイナライザスレッドが存在してもよい..異なるGCの実装の間で変化してもよいです。

java language specから、「ファイナライザは、任意の順序で、または同時に呼び出すことができます。」

2

んが、あなたがすることはできません - 少なくとも私の知る限りホットスポットの実装を理解するよう:

は、少なくともそれはそれはマーク&スイープGCでどのように動作するかですが、私はそれが他のすべての実装に似てかなり確信しています

マークされていないファイナライズされたオブジェクトはすべて、マークビットが設定されたワークリストに追加されます。

次に、バックグラウンドワーカーがこのリストを処理し、1つのファイナライズコールで終了した後、マークビットがクリアされ、次のGCでクリアされます。その結果、finalizeメソッドがいつ呼び出されるかについては何も仮定することはできません(バックグラウンドスレッドはおそらく停止している可能性があるので、GC実行中ではないことを確かめることができます)。

は今ではホットスポットのための実装の詳細だとも

関連する問題