Когда поток ReferenceHandler уведомляется? - PullRequest
3 голосов
/ 18 ноября 2011

Мы знаем, что поток ReferenceHandler отвечает за постановку в очередь ожидающего экземпляра Reference для ReferenceQueue , см. Этот код в Reference $ ReferenceHandler.run ():

public void run() {
    for (;;) {

    Reference r;
    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;
        }
    }

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

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

Если ожидающая очередь равна нулю, то этот поток ожидает lock ;

Мой вопрос, когда этот поток уведомляется?Когда ожидающий изменения экземпляр изменен?

1 Ответ

2 голосов
/ 18 ноября 2011

из кода

/* Object used to synchronize with the garbage collector.  The collector
 * must acquire this lock at the beginning of each collection cycle.  It is
 * therefore critical that any code holding this lock complete as quickly
 * as possible, allocate no new objects, and avoid calling user code.
 */
static private class Lock { };
private static Lock lock = new Lock();

Это означает, что сборщик выдаст notify(), когда он завершит работу, и для его активации потребуется ReferenceHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...