Метод 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;
}

Обратите внимание, что метод может быть внутренним (то есть он заменяется во время выполнения чем-то более эффективным, обычно одной инструкцией процессора)

Другие вопросы по тегам