2010-09-29 15 views

Respuesta

6

parece que es funcionalmente equivalente a AtomicReference[], ocupando un poco menos de memoria sin embargo.

Por lo tanto, es útil cuando necesita más de un millón de referencias atómicas, no se puede pensar en ningún caso de uso.

+0

no exactamente correcto - vea la respuesta de fahd para obtener una descripción. – aperkins

+1

Una respuesta mucho mejor que la aceptada. Ahorra espacio frente a una AtomicReference []: una copia de la clase insegura, muchas referencias a objetos sobre las que puede actuar. – themightyjon

1

Podría ser útil si tiene una gran cantidad de objetos que se actualizan al mismo tiempo, por ejemplo, en una gran partida de varios jugadores.

Una actualización de referencia i seguiría el patrón

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

Dependiendo de las circunstancias, esto puede ser más rápido y/o más fácil de usar que el bloqueo (synchronized).

8

Si tenía una matriz compartida de referencias a objetos, entonces usaría AtomicReferenceArray para asegurarse de que la matriz no se pudiera actualizar simultáneamente por diferentes hilos, es decir, solo se puede actualizar un elemento a la vez.

Sin embargo, en un AtomicReference[] (matriz de AtomicReference) múltiples hilos aún pueden actualizar diferentes elementos simularmente, porque la atomicidad está en los elementos, no en la matriz como un todo.

Más información here.

+1

varios subprocesos pueden actualizar elementos AtomicReferenceArray simultáneamente. – irreputable

+0

No pueden. Lee el enlace que publiqué. – dogbane

+0

Entonces, ¿cuál es la diferencia entre 'AtomicReferenceArray' y' AtomicReference [] '? La implementación de Sun es por Doug Lea. – dogbane

1

Un caso de uso posible habría sido ConcurrentHashMap que utiliza ampliamente la matriz internamente. La matriz puede ser volátil, pero a nivel de elemento las sematicas no pueden ser volátiles. es una de las razones por la cual la matriz automic surgió.

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

¿Podría explicar este código? – Twisty

Cuestiones relacionadas