基本的に、現在オブジェクトを使用しているスレッドの数を知りたいです。誰もこのオブジェクト参照を使用していない場合は、このオブジェクトを破棄したいと考えています。
例
User u = new User();
(here I have other code)
if (u is not used by any thread) {
u = null;
}
基本的に、現在オブジェクトを使用しているスレッドの数を知りたいです。誰もこのオブジェクト参照を使用していない場合は、このオブジェクトを破棄したいと考えています。
例
User u = new User();
(here I have other code)
if (u is not used by any thread) {
u = null;
}
この質問は、Java メモリ管理の根本的な誤解に基づいています。
変数null
への割り当ては、以前に参照したオブジェクトを破棄しません。実際に行うことは、「到達可能」にするオブジェクトへのおそらく多くのパス (ライブ変数からの参照のチェーン) の 1 つを切断することです。パスが存在しなくなると、オブジェクトはプログラム内で到達 (使用) できなくなり、ガベージ コレクションの対象となります。実際にいつ消えるかは、JVM / ガベージ コレクターの裁量です。
User
他に何も参照されていないときに、オブジェクトを「立ち去らせよう」としています。しかし、それはとにかく起こります。本当に必要なのは、この変数が User オブジェクトの消失を止めないように、無条件に割り当てるnull
ことだけです。u
User
オブジェクトを「今すぐ」消えさせることができますか? 答えは複雑で、要約すると次のようになります。
そして、質問タイトルの質問に答えます。
現在オブジェクトを使用しているスレッドの数を調べる方法はありますか?
いいえ、あなたが意味する意味ではありません。JVM は、オブジェクトの参照のライブ コピーがいくつあるかを調べる方法さえ提供していません。JVM がこれを提供するのに最も近いのは、オブジェクトへの通常の (強い) 参照がなくなったことを検出するために使用できるSoftReference
およびクラスです。WeakReference
しかし、これはあなたの「問題」を解決するために必要ではありません。