- 直系の既知のサブクラス:
- PhantomReference,- SoftReference,- WeakReference
public abstract class Reference<T> extends Object
- 導入されたバージョン:
- 1.2
- 
メソッドのサマリー修飾子と型 メソッド 説明 voidclear()この参照オブジェクトをクリアします。protected Objectclone()CloneNotSupportedExceptionをスローします。booleanenqueue()この参照オブジェクトをクリアし、それが登録されているキューに登録オブジェクトを追加します。Tget()参照オブジェクトのリファレントを返します。booleanisEnqueued()この参照オブジェクトが、プログラムまたはガベージ・コレクタによってキューに入れられているかどうかを判定します。static voidreachabilityFence(Object ref)指定された参照によって参照されるオブジェクトが、オブジェクトが到達不能になる可能性のあるプログラムの以前のアクションに関係なく、「強く到達可能な」のままであることを保証します。このため、参照されたオブジェクトは、少なくともこのメソッドが呼び出されるまでガベージ・コレクションによって再要求できません。
- 
メソッドの詳細- 
getpublic T get()参照オブジェクトのリファレントを返します。 プログラムまたはガベージ・コレクタによって、この参照オブジェクトがすでにクリアされている場合、このメソッドはnullを返します。- 戻り値:
- この参照が表すオブジェクト。この参照オブジェクトがクリアされている場合はnull
 
- 
clearpublic void clear()この参照オブジェクトをクリアします。 このメソッドを呼び出しても、このオブジェクトはキューに入りません。このメソッドはJavaコードによってのみ呼び出されます。ガベージ・コレクタが参照をクリアするときは、このメソッドを呼び出さずに直接行います。 
- 
isEnqueuedpublic boolean isEnqueued()この参照オブジェクトが、プログラムまたはガベージ・コレクタによってキューに入れられているかどうかを判定します。 この参照オブジェクトが生成されたときにキューに登録されていない場合、このメソッドは常にfalseを返します。- 戻り値:
- この参照オブジェクトがキューに入れられている場合にだけtrue
 
- 
enqueuepublic boolean enqueue()この参照オブジェクトをクリアし、それが登録されているキューに登録オブジェクトを追加します。このメソッドはJavaコードによってのみ呼び出されます。ガベージ・コレクタが参照をキューに入れるときは、このメソッドを呼び出さずに直接行います。 - 戻り値:
- この参照オブジェクトがキューに入れられた場合はtrue。すでにキューに入れられているか、作成時にキューに登録されなかった場合はfalse
 
- 
cloneprotected Object clone() throws CloneNotSupportedException- オーバーライド:
- clone、クラス:- Object
- 戻り値:
- 通常の戻り値はありません
- 例外:
- CloneNotSupportedException- 常時
- 導入されたバージョン:
- 11
- 関連項目:
- Cloneable
 
- 
reachabilityFencepublic static void reachabilityFence(Object ref)指定された参照によって参照されるオブジェクトが、オブジェクトが到達不能になる可能性のあるプログラムの以前のアクションに関係なく、「強く到達可能な」のままであることを保証します。このため、参照されたオブジェクトは、少なくともこのメソッドが呼び出されるまでガベージ・コレクションによって再要求できません。 このメソッドを呼び出すだけで、ガベージ・コレクションやファイナライズが開始されることはありません。このメソッドは、ガベージ・コレクションに関する「強い到達性」の順序付けを確立します。 プログラム内に暗黙的にしか存在しないリレーションを制御-- 到達可能性条件はガベージ・コレクションを引き起こす。 このメソッドは、 synchronizedブロックまたはメソッドを使用する、または他の同期機能を使用することができない、または必要な制御を提供しない早すぎる終了の珍しい状況で使用するために設計されています。 このメソッドは、再利用すると表示される効果がある場合にのみ適用されます。これは、正しいかどうかの順序付け制御に依存する方法で実装された、ファイナライザ(「Java™言語仕様」の12.6項を参照してください。)を持つオブジェクトで有効です。- APIのノート:
- 仮想マシンが、オブジェクトへの参照がヒープに格納されることがないことを検出するたびに、ファイナライズが行われることがあります: ガベージ・コレクタは、たとえオブジェクトが到達不能になっている限り、そのオブジェクトのフィールドがまだ使用中であっても、オブジェクトを再要求することができます。 これは、クラスに関連付けられた簿記が配列インデックスによって管理される以下の例のような場合に、驚くほど望ましくない影響を及ぼすことがあります。 ここで、メソッドactionはreachabilityFenceを使用して、関連付けられたExternalResourceの簿記が実行される前にResourceオブジェクトが再利用されないようにします。特にここでは、ExternalResourceを保持する配列スロットがメソッドObject.finalize()でゼロにならないようにします。そうでなければ同時に実行することができます。
 ここでは、の呼び出しは、class Resource { private static ExternalResource[] externalResourceArray = ... int myIndex; Resource(...) { myIndex = ... externalResourceArray[myIndex] = ...; ... } protected void finalize() { externalResourceArray[myIndex] = null; ... } public void action() { try { // ... int i = myIndex; Resource.update(externalResourceArray[i]); } finally { Reference.reachabilityFence(this); } } private static void update(ExternalResource ext) { ext.status = ...; } }actionの呼び出しがこのオブジェクトの最後の使用であったとしても、更新前にupdateの呼び出し後にreachabilityFenceを呼び出すと、配列スロットがObject.finalize()によってヌルされないことが保証されます。 これは、例えば、ユーザー・プログラムの使用が、このResourceへの他の参照を保持しない形式new Resource().action();を有する場合です。finallyブロックにreachabilityFenceブロックが置かれ、メソッド内のすべてのパスで確実に呼び出されるようにします。 より複雑な制御パスを持つメソッドでは、reachabilityFenceがすべてのパスに沿って遭遇するように、さらに注意を払う必要があります。reachabilityFenceの使用をよりよくカプセル化することが時折可能です。 上の例を続けて、ファイナライザが既に(ヌル・アウト・スロット)を実行していても、メソッドupdateへの呼び出しが進行しても問題ない場合は、reachabilityFenceの使用をローカライズすることができます:public void action2() { // ... Resource.update(getExternalResource()); } private ExternalResource getExternalResource() { ExternalResource ext = externalResourceArray[myIndex]; Reference.reachabilityFence(this); return ext; }メソッド reachabilityFenceは、それ自身が到達可能性を保証する構造では必要ありません。 たとえば、ロックされているオブジェクトは一般には再利用できないため、クラスResource(finalizeを含む)のすべてのメソッドでオブジェクトのすべてのアクセスがsynchronized (this)ブロックで囲まれていれば十分です。 (さらに、このようなブロックには、"一般に"免責条項の例外を除いて、無限ループまたはそれ自体が到達不能であってはなりません。) しかし、この手法が効率的、望ましい、または可能ではない場合、メソッドreachabilityFenceはより良い選択肢のままです。たとえば、デッドロックが発生するためです。
- パラメータ:
- ref- 参照。- nullの場合、このメソッドは効果がありません。
- Java言語仕様を参照してください:
- 
12.6 クラス・インスタンスのファイナライズ
- 導入されたバージョン:
- 9
 
 
-