2017-01-30 11 views
0

基本的なレベルで、以下の状況でスレッドに渡されるローカル変数に何が起こるかを理解しようとしています。 deleteメソッドを持つsomeObjectでクリーンアップアクションが発生する必要があります。このメソッドはsomeObjectのインスタンスをメンバーであるidで削除する外部APIを呼び出します。引数を新しいスレッドに渡すときのローカル変数参照とGC

public interface Deleteable { 
    public delete() 
} 

public SomeClass implements Deleteable { 
    int id; 
    public void delete() { 
     HttpApiCall.deleteById(this.id); 
    } 
} 

SomeClass someObject = null; 
for(i = 0; i < 3; i++) { 
// simple loop to illustrate problem 
    someObject = new SomeClass(); 
    Runtime.getRuntime() 
    .addShutdownHook(new Thread(someObject::delete)); 
} 

プログラムが実行されている間、スレッドが削除を呼び出せるようになる前にSomeClassのインスタンスの一部がGC'edされますか?各スレッドは、新しく作成された独自のコピーを受け取るか、最後に設定した値のsomeObjectで動作しますか?

私はvolatileキーワードについて少し読んでいますが、私はここで私を助けてくれるのか分かりません。

+0

シャットダウンフックが呼び出されない場合、どの程度深刻ですか?それは可能ですから。 – Kayaman

+0

シャットダウンフックが呼び出されない状況についてさらに詳しく説明できますか? – ferahgo

+0

これはjavadocのすべてです。 – Kayaman

答えて

2

いいえRuntimeのコレクションにこれらのsomeObject::deleteメソッド参照を追加しています。 Runtimeにはまだ到達可能なので、これらのオブジェクトも到達可能であり、GCdを取得すべきではありません。

+0

開始されていないスレッドから参照されていることは言うまでもありません。 – Kayaman