блокировка CAS путаница - PullRequest
0 голосов
/ 13 мая 2011

Эй, ребята,
Я читаю эти так называемые неблокирующие методы, но у меня мало сомнений:

1) операции без блокировки выполняются с использованием атомарной операции, теперь что это за атомная операция?Я имею в виду, на определенном уровне они также должны иметь право блокировки?так обеспечивает ли этот подход без блокировок блокировку только при более высокой степени детализации?
2) они говорят, что неблокирующий список: что должен быть неблокирующий список: если при одной и той же вставке будет более одного потока, удастся добиться успеха только одному потоку, другой будет правильно выполнять другую работу?, но если другой поток не имеет другого выбора, кроме вставки узла, то почему он не блокируется?не будет ли он заблокирован, пока предыдущий не будет сделан ??
3) В Java, как они работают на атомах?разве они не делают что-то вроде synchronized boolean ..... , так как это без блокировки, так как они получают блокировку, то есть синхронизированную секцию?4) CAS обычно используется для реализации атомарной операции.Так разве cas не допускает выполнение только одной операции над одним и тем же объектом и останавливает ( block ) другие, которые хотят работать с тем же объектом?Извините за столько сомнений ... пожалуйста, уточните ...

РЕДАКТИРОВАТЬ что происходит, когда у меня есть структура для обновления?это также поддерживается аппаратно?Правильно, так разве язык не получал бы блокировки на каком-то уровне, чтобы сделать эти операции структуры атомарными?
О JAVA : существуют классы AtomicReference и AtomicReferenceFieldUpdater, которые обеспечивают обновление объекта (структуры или любого другого объекта).вид объекта), поэтому мы можем сравнить их с точки зрения производительности, я имею в виду скорость?Оба в крачке использует класс Unsafe, который использует класс Native.

Ответы [ 2 ]

5 голосов
/ 13 мая 2011

Вот простой метод без блокировки в 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 обычно используется для реализации атомарной операции. Так что нельзя допустить, чтобы с одним объектом происходила только одна операция,

номер

и останавливает (блокирует) других тех, кто хочет работать на том же объекте?

номер

Опять же, если вы посмотрите на то, как оно используется, это может иметь больше смысла.

2 голосов
/ 13 мая 2011

1) операции без блокировки выполняются с использованием атомарной операции, что теперь это за атомная операция?

Например, увеличение счетчика включает

  1. чтениетекущее значение,
  2. увеличение значения в памяти,
  3. запись обновленного значения.

Атомарность означает, что все это происходит как одно единое, единичное изменение.

Я имею в виду, что на определенном уровне им также нужно иметь блокировку, верно?

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

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

Преимущество CAS заключается в улучшении производительности благодаря тому, что даже с улучшенной производительностью блокировки в современных JVM, CASвсе еще дешевле, особенно в случае конфликта (то есть, когда несколько потоков сталкиваются при операции).В этом случае при использовании блокировок один или несколько потоков приостанавливаются, и вместо этого в контекст вводится новый поток, что является очень дорогостоящей операцией, даже если она не требует перестановки памяти.

2) они говорят, что список не является блокировкой. Теперь, какой должен быть список, не являющийся блокировкой

Здесь вы можете смешивать два разных термина.Неблокирующий список - это список, который не блокирует вставки / удаления, что обычно означает, что его размер не ограничен (например, CopyOnWriteArrayList).Сравните это, например, с очередью блокировки (например, ArrayBlockingQueue), которая имеет фиксированный максимальный размер, и по достижении ее предела размера дополнительные вызовы вставки заблокированы пока не будет доступно больше места (после того, как какой-то другой поток удалит элемент (ы) из очереди).

Коллекция, которая обеспечивает безопасность потока с помощью алгоритма без блокировки (например, ConcurrentHashMap) это не то же самое, что неблокирующая коллекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...