ナビゲーション・リンクをスキップ
Java(tm) Platform
Standard Edition 8

パッケージ java.lang.ref

参照オブジェクト・クラスを提供し、限定されたレベルでのガベージ・コレクタとの対話を可能にします。

参照: 説明

パッケージjava.lang.refの説明

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

パッケージの仕様

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

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

通知

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

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

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

自動的にクリアされる参照

ソフト参照および弱参照は、それらが登録されているキューに追加される前にコレクタによって自動的にクリアされます。そのため、ソフト参照および弱参照は、有効になるためにキューに登録される必要はありません(ファントム参照は必要)。ファントム参照を介して到達可能なオブジェクトは、ファントム参照がすべてクリアされるか、ファントム参照自体が到達不可能になるまで到達可能です。

到達可能性

到達可能性には最強から最弱までのレベルがあり、これはオブジェクトのライフ・サイクルを反映します。それらは、機能的に次のように定義されます。
導入されたバージョン:
1.2
ナビゲーション・リンクをスキップ
Java(tm) Platform
Standard Edition 8

バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2017, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyも参照してください。