Можно ли создать AtomicReference, который можно атомарно менять местами?

Есть ли способ реализовать тип ссылки, значение которой можно обменять на другую атомарно?


В Java у нас есть

11114872] AtomicReference , который может быть заменен на локальную переменную, но не на другую AtomicReference .

Вы можете:

AtomicReference r1 = new AtomicReference("hello");
AtomicReference r2 = new AtomicReference("world");

и поменять их местами с помощью комбинации двух операций:

r1.set(r2.getAndSet(r1.get()));

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

  • Я сделал здесь только группы из 2 ссылок, но возможность группировать 3 и более ссылок будет бонус.
  • Можно ли реализовать версию AtomicRefPair без блокировки? У меня есть подозрение, что это не так, но если нет, то, возможно, где-то есть статья, объясняющая, почему?


    По теме : Как атомарно поменять местами 2 целых в C #?

    6
    задан Community 23 May 2017 в 10:24
    поделиться