モジュール java.base

パッケージ java.lang.ref

参照オブジェクト・クラスを提供し、限定されたレベルでのガベージ・コレクタとの対話を可能にします。 ほかのあるオブジェクトがガベージ・コレクタによってすでに再生されていても、そのオブジェクトを指す参照を維持したい場合に、プログラムは参照オブジェクトを使うことができます。 さらに、プログラムは、あるオブジェクトへの到達可能性が変わったとガベージ・コレクタが判断したあとで、通知を受けるようにすることができます。

パッケージの仕様

参照オブジェクトは、その参照自体をほかのオブジェクトと同じように検査および操作できるようにするために、ほかのオブジェクトへの参照をカプセル化します。 弱いものから順に、ソフト、およびファントムという3種類の参照オブジェクトが提供されます。 各型は、次に定義されているように、対応する到達可能性のレベルがそれぞれ異なります。 ソフト・リファレンスはメモリー・センシティブなキャッシュを実装するためのもので、weakリファレンスはキー(値)の再利用を妨げない正規化マッピングを実装するためのもので、ファントム・リファレンスは死後のクリーンアップ・アクションのスケジューリング用です。 死後のクリーンアップ・アクションは、Cleanerによって登録および管理できます。

各参照オブジェクト型は、抽象基底のReferenceクラスのサブクラスによって実装されます。 それらのサブクラスのインスタンスは、リファレントと呼ばれる、特定のオブジェクトへの参照をカプセル化します。 各参照オブジェクトは、参照を取得およびクリアするためのメソッドを提供します。 クリア処理は提供されますが、参照オブジェクトは不変であるため、setオペレーションは提供されません。 プログラムは、これらのサブクラスをさらにサブクラス化して目的にあったフィールドおよびメソッドを追加することも、これらのサブクラスを変更しないでそのまま使うこともできます。

通知

プログラムは、適切な参照オブジェクトをそれが作成された時点で参照キュー登録することによって、オブジェクトの到達可能性が変更された通知を受け取るように要求できます。 ガベージ・コレクタが参照先の到達可能性が参照のタイプに対応する値に変更されたと判断した後、参照を消去して関連付けられたキューに追加します。 この時点で、参照はキューに入っているとみなされます。 プログラムは、参照が利用可能になるまでポーリングまたはブロックすることによって、キューから参照を削除できます。 参照キューは、ReferenceQueueクラスによって実装されます。

登録された参照オブジェクトとそのキューの関係は一方向です。 つまり、キューは登録されている参照の履歴を記録しません。 登録されている参照自体が到達不可能になると、それは絶対にキューに入れられません。 参照オブジェクトを使用してプログラムがリファレントを必要とするかぎりオブジェクトを到達可能にしておくことはプログラムの責任です。

プログラムによっては、あるスレッドを、1つ以上のキューからの参照オブジェクトの削除およびそれらの処理専用にするように選択されますが、これは、まったく必要ありません。 多くの場合にうまく機能する方法は、かなり頻繁に行われるほかのアクションを実行する間に参照キューを検査することです。 たとえば、弱キーを実装するために弱参照を使用するハッシュ表の場合は、表がアクセスされるたびに自分の参照キューに対してポーリングします。 これはWeakHashMapクラスの仕組みです。 ReferenceQueue.pollメソッドは単に内部データ構造をチェックするだけなので、このチェックがハッシュ表アクセス・メソッドに与えるオーバーヘッドはごくわずかです。

到達可能性

到達可能性には最強から最弱までのレベルがあり、これはオブジェクトのライフ・サイクルを反映します。 それらは、機能的に次のように定義されます。
  • 強到達可能なオブジェクトとは、参照オブジェクトをトラバースすることなく、あるスレッドによって到達できるオブジェクト。 新しく作成されたオブジェクトは、それを作成したスレッドにより強到達可能。
  • ソフト到達可能なオブジェクトとは、強到達可能ではないが、ソフト参照をトラバースすることで到達できるオブジェクト。
  • 弱到達可能なオブジェクトとは、強到達可能でもソフト到達可能でもないが、弱参照をトラバースすることで到達できるオブジェクト。 弱到達可能なオブジェクトへの弱参照がクリアされると、そのオブジェクトはファイナライズの対象となる。
  • ファントム到達可能オブジェクトとは、強到達可能でも、ソフト到達可能でも、弱到達可能でもなく、ファイナライズされており、ファントム参照がそれを指しているオブジェクト。
  • 最後に、オブジェクトがどのようにも到達できない場合、そのオブジェクトは到達不可能であり、そのため再生の対象となる。
導入されたバージョン:
1.2