Top


定義場所(file name)

jdk/src/share/classes/java/lang/ref/Reference.java

名前(function name)

        public void run() {

本体部(body)

  {- -------------------------------------------
  (1) (以下の処理を無限ループで繰り返す)
      ---------------------------------------- -}

                for (;;) {

                    Reference r;

    {- -------------------------------------------
  (1.1) pending から次の要素を取り出す.
        (空だった場合は, 要素が入ってくるまで待機)

        (なお, この処理は Garbage Collector と競合するとまずいため, 
         lock で排他して行っている. (See: [here](no289169tf.html) for details))
        ---------------------------------------- -}

                    synchronized (lock) {
                        if (pending != null) {
                            r = pending;
                            Reference rn = r.next;
                            pending = (rn == r) ? null : rn;
                            r.next = r;
                        } else {
                            try {
                                lock.wait();
                            } catch (InterruptedException x) { }
                            continue;
                        }
                    }

    {- -------------------------------------------
  (1.1) 取り出したオブジェクトが sun.misc.Cleaner クラスのインスタンスの場合は少し最適化.
        (この場で sun.misc.Cleaner.clean() を呼び出して, その要素の処理は終了)
        ---------------------------------------- -}

                    // Fast path for cleaners
                    if (r instanceof Cleaner) {
                        ((Cleaner)r).clean();
                        continue;
                    }

    {- -------------------------------------------
  (1.1) sun.misc.Cleaner クラスでない場合は, 
         その参照オブジェクトが登録されている ReferenceQueue オブジェクトを見つけ, そこにその参照オブジェクトをプッシュする.
         (ReferenceQueue に登録されていない参照オブジェクトの場合は何もしない)
        ---------------------------------------- -}

                    ReferenceQueue q = r.queue;
                    if (q != ReferenceQueue.NULL) q.enqueue(r);
                }
            }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.