Метод getAndAdd в AtomicLong вызывает ожидание потоков?
У меня есть программа, работающая с несколькими потоками, все потоки разделяются и обрабатываются в одной переменной AtomicLong. Каждый из них позвонит getAndAdd()
Метод, чтобы сначала получить значение и обработать дальше.
Если все потоки работают одновременно, вызывает ли вызов вышеупомянутого метода один поток, ожидающий, пока другой поток не завершит получение значения?
1 ответ
Темы не ждут (в смысле Object::wait
), они зацикливаются, пока им не удастся получить и добавить в AtomicLong
,
Для справки, код в JDK 8 выглядит так:
public final long getAndAddLong(Object o, long offset, long delta) {
long v;
do {
v = getLongVolatile(o, offset);
} while (!compareAndSwapLong(o, offset, v, v + delta));
return v;
}
Обратите внимание, что метод может быть внутренним (то есть он заменяется во время выполнения чем-то более эффективным, обычно одной инструкцией процессора)