Вот простой метод без блокировки в AtomicInteger
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
Вы можете видеть, что он получает значение, увеличивает его и выполняет compareAndSwap. Если compareAndSwap не находит ожидаемое значение, это означает, что другой поток изменил значение. Таким образом, он пытается снова и снова, пока все другие потоки, пытающиеся изменить значение, не сделают это. Это блокировка свободна, поскольку блокировка не используется, но не блокировка свободна, поскольку может потребоваться повторить попытку (что редко) более одного раза (очень редко)
1) Операции без блокировки выполняются с помощью атомарной операции. Что же это за атомная операция? Я имею в виду, на определенном уровне они также должны иметь право блокировки? Так обеспечивает ли этот подход без блокировок блокировку только при более высокой степени детализации?
Однако блокировки реализованы с использованием более примитивных операций. В противном случае вам понадобится блокировка для реализации блокировки adnauseum. Подход без блокировки использует атомарные операции, которые позволяют избежать полной блокировки.
2) они говорят, что неблокирующий список: что должен быть неблокирующий список: если при одной и той же вставке будет более одного потока, только один получит успех, другой выполнит какую-то другую работу, верно?
Если его потокобезопасен, они оба должны преуспеть, по одному за раз.
но если другой поток не имеет другого выбора, кроме вставки узла, то почему он не блокируется?
Термин "параллельный". Ему все еще нужно дождаться завершения другого потока, для этого используется подход без блокировки.
не будет ли он заблокирован, пока предыдущий не будет сделан ??
да.
3) В Java, как они работают на атомах?
Существует собственный метод вызова, который выполняет атомарные операции. Вы можете увидеть это, прочитав код. ;) Судя по сгенерированному собственному коду, эти нативные методы превращаются в инструкции машинного кода по производительности (а не как истинный вызов метода)
разве они не делают что-то вроде синхронизированного логического выражения ..... так как же оно не блокируется, поскольку они получают блокировку, т.е. синхронизированный раздел?
Нет, если вы прочитаете код, вы увидите, что это не так.
4) CAS обычно используется для реализации атомарной операции. Так что нельзя допустить, чтобы с одним объектом происходила только одна операция,
номер
и останавливает (блокирует) других тех, кто хочет работать на том же объекте?
номер
Опять же, если вы посмотрите на то, как оно используется, это может иметь больше смысла.