Есть ли блокировка в методе Atomi c compareAndSet в Java? - PullRequest
0 голосов
/ 05 апреля 2020

Если у меня есть что-то вроде:

AtomicReference<String> atomicReference = new AtomicReference<>("abc");

У меня есть 2 потока, выполняющих код:

Поток 1: atomicReference.compareAndSet("abc", "def")

Поток 2: atomicReference.compareAndSet("abc", "efg")

Может ли быть случай, когда оба потока одновременно превышают это значение и находят объявленное значение "ab c", и оба выполняют метод или если один поток превысит сравнение, а другому придется ждать, пока он не завершится (в основном какой-то механизм блокировки)?

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

В общем, разумная реализация не будет использовать блокировку для атома c compareAndSet. Некоторые старые / очень бюджетные 32-разрядные архитектуры могут использовать блокировку для AtomicLong.

. Тела метода (некоторые архитектуры) могут разрешать выполнение более чем одним потоком одновременно, но только одна может быть успешной .

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

Может случиться так, что оба потока будут выполняться одновременно. Но всегда есть только один «победитель», только один добьется успеха.

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

Из документации:

Пакет java .util.concurrent.atomi c

Небольшой набор классов, поддерживающих блокировку бесплатное поточно-ориентированное программирование для отдельных переменных.

...