モジュール 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ブロックまたはメソッドを使用できない、または他の同期機能を使用できない、または必要な制御を提供しない、早期のファイナライズのまれな状況で使用するように設計されています。 この方法は、リクレイムが目に見える影響を与える可能性がある場合にのみ適用され、ファイナライザ(The Java™Language SpecificationSection 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 = ...;
           }
         }
        ここで、reachabilityFenceの呼出しは、updateの呼出しのに直感的に配置され、actionの呼出しがこのオブジェクトの最後に使用されたとしても、更新前に配列スロットがObject.finalize()によってヌルアウトされないようにします。 たとえば、ユーザー・プログラムでの使用方法が、このResourceへの他の参照を保持しないnew Resource().action();という形式の場合に、これが発生する可能性があります。 ここでオーバーキルしている可能性がありますが、reachabilityFencefinallyブロックに配置され、メソッド内のすべてのパスで確実に呼び出されます。 より複雑な制御パスを持つメソッドでは、reachabilityFenceがすべてのパスとともに検出されるように、さらに注意が必要な場合があります。

        reachabilityFenceの使用をより適切にカプセル化できる場合があります。 前述の例を続けて、ファイナライザがすでに実行されていてもメソッドupdateの呼出しが続行できる(スロットのNULL化)場合は、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