jdk/src/share/classes/java/lang/ref/Reference.java
public void run() {
{- -------------------------------------------
(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.