- java.lang.Object
-
- java.lang.ref.Reference<T>
-
- 直系の既知のサブクラス:
PhantomReference
,SoftReference
,WeakReference
public abstract class Reference<T> extends Object
参照オブジェクトための抽象基底クラスです。 このクラスは、すべての参照オブジェクトに対して共通のオペレーションを定義します。 参照オブジェクトはガベージ・コレクタと密接に連携して実装されるので、このクラスを直接サブクラス化することはできません。- 導入されたバージョン:
- 1.2
-
-
メソッドのサマリー
すべてのメソッド 静的メソッド インスタンス・メソッド 具象メソッド 修飾子と型 メソッド 説明 void
clear()
この参照オブジェクトをクリアします。protected Object
clone()
CloneNotSupportedException
をスローします。boolean
enqueue()
この参照オブジェクトをクリアし、それが登録されているキューに登録オブジェクトを追加します。T
get()
参照オブジェクトのリファレントを返します。boolean
isEnqueued()
この参照オブジェクトが、プログラムまたはガベージ・コレクタによってキューに入れられているかどうかを判定します。static void
reachabilityFence(Object ref)
指定された参照によって参照されるオブジェクトが、オブジェクトが到達不能になる可能性のあるプログラムの以前のアクションに関係なく、「強く到達可能な」のままであることを保証します。このため、参照されたオブジェクトは、少なくともこのメソッドが呼び出されるまでガベージ・コレクションによって再要求できません。
-
-
-
メソッドの詳細
-
get
public T get()
参照オブジェクトのリファレントを返します。 プログラムまたはガベージ・コレクタによって、この参照オブジェクトがすでにクリアされている場合、このメソッドはnull
を返します。- 戻り値:
- この参照が表すオブジェクト。この参照オブジェクトがクリアされている場合は
null
-
clear
public void clear()
この参照オブジェクトをクリアします。 このメソッドを呼び出しても、このオブジェクトはキューに入りません。このメソッドはJavaコードによってのみ呼び出されます。ガベージ・コレクタが参照をクリアするときは、このメソッドを呼び出さずに直接行います。
-
isEnqueued
public boolean isEnqueued()
この参照オブジェクトが、プログラムまたはガベージ・コレクタによってキューに入れられているかどうかを判定します。 この参照オブジェクトが生成されたときにキューに登録されていない場合、このメソッドは常にfalse
を返します。- 戻り値:
- この参照オブジェクトがキューに入れられている場合にだけ
true
-
enqueue
public boolean enqueue()
この参照オブジェクトをクリアし、それが登録されているキューに登録オブジェクトを追加します。このメソッドはJavaコードによってのみ呼び出されます。ガベージ・コレクタが参照をキューに入れるときは、このメソッドを呼び出さずに直接行います。
- 戻り値:
- この参照オブジェクトがキューに入れられた場合は
true
。すでにキューに入れられているか、作成時にキューに登録されなかった場合はfalse
-
clone
protected Object clone() throws CloneNotSupportedException
- オーバーライド:
clone
、クラスObject
- 戻り値:
- このインスタンスの複製。
- 例外:
CloneNotSupportedException
- 常時- 導入されたバージョン:
- 11
- 関連項目:
Cloneable
-
reachabilityFence
public static void reachabilityFence(Object ref)
指定された参照によって参照されるオブジェクトが、オブジェクトが到達不能になる可能性のあるプログラムの以前のアクションに関係なく、「強く到達可能な」のままであることを保証します。このため、参照されたオブジェクトは、少なくともこのメソッドが呼び出されるまでガベージ・コレクションによって再要求できません。 このメソッドを呼び出すだけで、ガベージ・コレクションやファイナライズが開始されることはありません。このメソッドは、ガベージ・コレクションに関する「強い到達性」の順序付けを確立します。 プログラム内に暗黙的にしか存在しないリレーションを制御-- 到達可能性条件はガベージ・コレクションを引き起こす。 このメソッドは、
synchronized
ブロックまたはメソッドを使用する、または他の同期機能を使用することができない、または必要な制御を提供しない早すぎる終了の珍しい状況で使用するために設計されています。 このメソッドは、可視化効果があるレクラメーションがある場合にのみ適用されます。これは、順序制御の正確性に依存する方法で実装されたファイナライザ(「Java™言語仕様のセクション12.6 17」を参照してください)を持つオブジェクトで可能です。- 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
の場合、このメソッドは効果がありません。- 導入されたバージョン:
- 9
-
-