Просматривая раздел "Блокирующие/неблокирующие алгоритмы" на ссылке

и приведенный ниже код для объяснения операции Atomic compareAndSet

boolean updated = false;
while(!updated){
long prevCount = this.count.get();
updated = this.count.compareAndSet(prevCount, prevCount + 1);
}

В нем говорится, что

Поэтому нет необходимости в синхронизации, и нет необходимости в приостановке потока. не требуется. Это экономит накладные расходы на приостановку потоков.

Означает ли это, что если в приведенном выше коде 2 потока одновременно вызовут compareAndSet(), то оба они будут выполняться совместно или параллельно, в отличие от синхронизированного блока, где один поток блокируется, если оба обращаются одновременно? Если это так, то не будут ли значения перезаписаны в вышеупомянутом случае? И то же самое происходит в случае отсутствия синхронизации?

ghostrider

Ответов: 1

Ответы (1)

Значение AtomicLong находится в кэш-линии. В X86 есть функция под названием блокировка кэшлайна, которая используется для заблокированных инструкций. Поэтому, когда выполняется cas, кэшлайн сначала переводится в измененное/исключительное состояние, а затем блокируется.

Если другой ЦП хочет получить доступ к той же кэш-линии, его запросы на согласование кэша, включая запрос на право владения, будут игнорироваться до тех пор, пока кэш-линия не будет разблокирована.

Так что это очень легкая форма синхронизации. Если вам повезет, у другого процессора есть несколько неподходящих по порядку инструкций, которые он может выполнить, пока ждет кэшлайн.

Этот подход называется неблокирующим, хотя он может привести к "блокировке" других потоков, поскольку им приходится ждать. Основное отличие от блокирующего алгоритма заключается в том, что не может случиться так, чтобы процессор (поток), владеющий заблокированной кэш-линией, был приостановлен, пока он заблокировал эту кэш-линию. Об этом заботятся на аппаратном уровне (поэтому процессор не может быть прерван между получением и освобождением блокировки кэшлайна). Таким образом, блокировка гарантированно будет очень короткой, а не беспредельной, как в блокирующем алгоритме.

Согласно @BeeOnRope, здесь также может быть задействовано оптимистичное поведение, но это выходит за рамки моего уровня знаний.

2022 WebDevInsider