Если CompareAndSet не удается, выполняется ли приведенный ниже код? - PullRequest
0 голосов
/ 14 апреля 2020

У меня очень тупой вопрос. Если я использую AtomicReferences, то сравниваюAndSet следующим образом:

    original.set(atomic.get());
    long next = some new value
    atomic.compareAndSet(original.get(), next);
    ....more code....

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

PS Как ни странно, если я использую синхронизацию в этом коде, это дает мне правильный ответ на моем ноутбуке, но не на моем рабочем столе

1 Ответ

0 голосов
/ 14 апреля 2020

MangatRaiModi и SotiriosDelimanolis поставили меня на правильный путь. Простое исправление:

    original.set(atomic.get());
    long next = some new value
    while(!atomic.compareAndSet(original.get(), next))
    {
      do above again
    }
    ....more code....

сделал это. До сих пор не уверен, как синхронизируется это исправить на моем ноутбуке, но не на моем рабочем столе. Я предполагаю, что это замедляет потоки на мобильном чипе настолько, чтобы они могли работать последовательно (как оператор Print). Хотя я, вероятно, ошибаюсь.

...