2010-09-29 6 views

ответ

6

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

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

+0

не совсем правильный - см. Ответ fahd для описания. – aperkins

+1

Гораздо лучший ответ, чем принятый. Это экономит пространство по сравнению с AtomicReference [] - одна копия класса Unsafe, множество ссылок на объекты, на которые он может воздействовать. – themightyjon

1

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

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

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

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

8

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

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

Дополнительная информация here.

+1

несколько потоков могут одновременно обновлять элементы AtomicReferenceArray. – irreputable

+0

Они не могут. Прочитайте ссылку, которую я опубликовал. – dogbane

+0

Какая разница между 'AtomicReferenceArray' и' AtomicReference [] '? Реализация Солнца - Дуг Ли. – dogbane

1

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

0
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 
+1

Не могли бы вы объяснить этот код? – Twisty

Смежные вопросы