モジュール java.base
パッケージ 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
      • reachabilityFence

        public static void reachabilityFence​(Object ref)
        指定された参照によって参照されるオブジェクトが、オブジェクトが到達不能になる可能性のあるプログラムの以前のアクションに関係なく、強く到達可能なのままであることを保証します。このため、参照されたオブジェクトは、少なくともこのメソッドが呼び出されるまでガベージ・コレクションによって再要求できません。 このメソッドを呼び出すだけで、ガベージ・コレクションやファイナライズが開始されることはありません。

        このメソッドは、ガベージ・コレクションに関する強い到達性の順序付けを確立します。 プログラム内に暗黙的にしか存在しないリレーションを制御-- 到達可能性条件はガベージ・コレクションを引き起こす。 このメソッドは、synchronizedブロックまたはメソッドを使用する、または他の同期機能を使用することができない、または必要な制御を提供しない早すぎる終了の珍しい状況で使用するために設計されています。 このメソッドは、可視化効果があるレクラメーションがある場合にのみ適用されます。これは、順序制御の正確性に依存する方法で実装されたファイナライザ(Java™言語仕様のセクション12.6 17」を参照してください)を持つオブジェクトで可能です。

        APIのノート:
        仮想マシンが、オブジェクトへの参照がヒープに格納されることがないことを検出するたびに、ファイナライズが行われることがあります: ガベージ・コレクタは、たとえオブジェクトが到達不能になっている限り、そのオブジェクトのフィールドがまだ使用中であっても、オブジェクトを再要求することができます。 これは、クラスに関連付けられた簿記が配列インデックスによって管理される以下の例のような場合に、驚くほど望ましくない影響を及ぼすことがあります。 ここで、メソッドactionreachabilityFenceを使用して、関連付けられた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