Какая польза от AtomicReferenceArray? - PullRequest
11 голосов
/ 29 сентября 2010

Когда стоит использовать AtomicReferenceArray? Пожалуйста, объясните на примере.

Ответы [ 5 ]

9 голосов
/ 29 сентября 2010

Если бы у вас был общий массив ссылок на объекты, вы бы использовали AtomicReferenceArray, чтобы гарантировать, что массив не может быть обновлен одновременно разными потоками, то есть только один элемент может быть обновлен за один раз.

Однако в AtomicReference[] (массиве AtomicReference) несколько потоков могут по-прежнему симулировать различные элементы, потому что атомарность находится на элементах, а не на массиве в целом.

Подробнее здесь .

9 голосов
/ 29 сентября 2010

выглядит как функционально эквивалентный AtomicReference[], хотя и занимает немного меньше памяти.

Так что это полезно, когда вам нужно более миллиона атомных ссылок - не могу придумать ни одного варианта использования.

1 голос
/ 25 февраля 2015

Одним из возможных вариантов использования был бы ConcurrentHashMap, который интенсивно использует массив внутри.Массив может быть изменчивым, но на уровне элемента семантика не может быть изменчивым.это одна из причин, по которой появился автомобильный массив.

1 голос
/ 29 сентября 2010

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

Обновление ссылки i будет следовать шаблону

boolean success = false;
while (!success)
{
    E previous = atomicReferenceArray.get(i);
    E next = ... // compute updated object
    success = atomicReferenceArray.compareAndSet(i, previous, next);
}

В зависимости от обстоятельств это может быть быстрее и / или проще в использовании, чем блокировка (synchronized).

0 голосов
/ 25 февраля 2015
import java.util.concurrent.atomic.AtomicReferenceArray;

public class AtomicReferenceArrayExample {
    AtomicReferenceArray<String> arr = new AtomicReferenceArray<String>(10);

    public static void main(String... args) {
        new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
        new Thread(new AtomicReferenceArrayExample().new AddThread()).start();
    }

    class AddThread implements Runnable {
        @Override
        public void run() {
            // Sets value at the index 1
            arr.set(0, "A");
            // At index 0, if current reference is "A" then it changes as "B".
            arr.compareAndSet(0, "A", "B");
            // At index 0, if current value is "B", then it is sets as "C".
            arr.weakCompareAndSet(0, "B", "C");
            System.out.println(arr.get(0));
        }
    }

}

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