почему есть метод for (;;) в методе AbstractQueuedSynchronize enq (последний узел узла) - PullRequest
0 голосов
/ 10 октября 2018

когда я читаю исходный код AbstractQueuedSynchronize, о методе

private Node enq(final Node node) {
        for (;;) {
            Node t = tail;
            if (t == null) { // Must initialize
                if (compareAndSetHead(new Node()))
                    tail = head;
            } else {
                node.prev = t;
                if (compareAndSetTail(t, node)) {
                    t.next = node;
                    return t;
                }
            }
        }
    }

Мне интересно, почему существует цикл for, поскольку он может быть таким:

private Node enq(final Node node) {
        Node t = tail;
        if (t == null) { // Must initialize
            if (compareAndSetHead(new Node()))
                tail = head;
        } 
        node.prev = tail;
        if (compareAndSetTail(t, node)) {
            t.next = node;
            return t;
        }
}

Доза это есть что-то связанное с одновременным?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Ваша перезапись не является эквивалентным кодом.В вашей версии, если вызов compareAndSetHead(new Node()) оценивается как ложный, tail будет по-прежнему null при node.prev = tail;

Оригинал, завернутый в for (;;) { ... }, будет продолжать попытки до tailне является null.

0 голосов
/ 10 октября 2018

Синтаксис используется, чтобы сказать, что то, что внутри, будет выполняться бесконечное количество раз.Это то же самое, что и:

while(true){..}

Это означает, что внутри должен быть оператор, прерывающий это бесконечное выполнение, который может быть break или return .

В вашем случае это оператор return , и бесконечный цикл используется для выполнения той же задачи, пока вы не достигнете условия для удовлетворения return .Это действительно только в том случае, если есть состояние / изменение в состоянии, которое используется для проверки условия выхода.В этом случае изменение происходит по ссылкам в структуре данных связанного списка.

...