Синхронизированный блок и оптимальное упорядочение цикла - PullRequest
0 голосов
/ 13 февраля 2019

Если я жду такого состояния (примечание: current - это AtomicInteger, а target - это int):

while (current.get() < target) {
    try {
        synchronized (current) {
            current.wait();
        }
    }
    catch (InterruptedException ie) {}
}

, тогда синхронизированные должны идти внутрьв то время как (как указано выше) или снаружи, как это?

synchronized (current) {
    while (current.get() < target) {
        try {
            current.wait();
        }
        catch (InterruptedException ie) {}
    }
}

Мой вопрос заключается в том, какова практическая / функциональная разница между двумя вышеупомянутыми частями кода и когда один должен использоваться поверх другого?

EDIT: цикл завершается, когда другой поток выполняет следующую операцию

if (current.incrementAndGet() >= target) {
    synchronized (current) {
        current.notify();
    }
}

1 Ответ

0 голосов
/ 13 февраля 2019

Это определяется тем, что является критической секцией кода, а не передовой практикой.


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

...