2010-09-29 24 views

Odpowiedz

6

wygląda na to, że jest funkcjonalnie równoważne AtomicReference[], zajmując jednak nieco mniej pamięci.

Jest to przydatne, gdy potrzebujesz więcej niż milion odniesień atomowych - nie można wymyślić żadnego przypadku użycia.

+0

nie do końca poprawne - patrz odpowiedź fahda dla opisu. – aperkins

+1

Znacznie lepsza odpowiedź niż zaakceptowana. Oszczędza przestrzeń w porównaniu do AtomicReference [] - jedna kopia klasy Unsafe, wiele odwołań do obiektów, na które może działać. – themightyjon

1

Może to być przydatne, jeśli masz dużą liczbę obiektów aktualizowanych jednocześnie, na przykład w dużej grze wieloosobowej.

Aktualizacja odniesienia i byłoby zgodne z wzorcem

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

W zależności od okoliczności może to być szybsze i/lub łatwiejsze w użyciu niż blokujący (synchronized).

8

Jeśli dysponujesz wspólną tablicą referencji do obiektów, użyjesz AtomicReferenceArray, aby zapewnić, że tablica nie może być aktualizowana jednocześnie przez różne wątki, tj. Tylko jeden element może być aktualizowany na raz.

Jednak w AtomicReference[] (tablica z AtomicReference) wiele wątków może nadal aktualizować różne elementy w sposób symulujący, ponieważ atomowość jest na elementach, a nie na tablicy jako całości.

Więcej informacji here.

+1

wiele wątków może jednocześnie aktualizować elementy AtomicReferenceArray. – irreputable

+0

Nie mogą. Przeczytaj opublikowany przeze mnie link. – dogbane

+0

Następnie jaka jest różnica między 'AtomicReferenceArray' i' AtomicReference [] '? Implementacja Sun jest autorstwa Douga Lea. – dogbane

1

Jednym z możliwych przypadków użycia byłaby funkcja ConcurrentHashMap, która intensywnie wykorzystuje tablicę wewnętrznie. Tablica może być niestabilna, ale na poziomie każdego elementu, sematycy nie mogą być niestabilne. to jeden z powodów powstania automatycznej tablicy.

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

Czy mógłbyś wyjaśnić ten kod? – Twisty

Powiązane problemy