¿Cuándo es una buena idea usar AtomicReferenceArray
? Por favor explique con un ejemplo.¿Cuál es el uso de AtomicReferenceArray?
Respuesta
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.
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
).
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.
varios subprocesos pueden actualizar elementos AtomicReferenceArray simultáneamente. – irreputable
No pueden. Lee el enlace que publiqué. – dogbane
Entonces, ¿cuál es la diferencia entre 'AtomicReferenceArray' y' AtomicReference [] '? La implementación de Sun es por Doug Lea. – dogbane
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ó.
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
¿Podría explicar este código? – Twisty
- 1. ¿cuál es el uso básico de alignment_storage?
- 2. ¿Cuál es el uso de singletonList?
- 3. ¿Cuál es el uso de window.external?
- 4. ¿Cuál es el uso previsto de IllegalStateException?
- 5. ¿Cuál es el uso correcto de DataContext.Refresh()?
- 6. ¿Cuál es el uso de @SuppressWarnings
- 7. ¿Cuál es el uso de autómatas finitos?
- 8. ¿Cuál es el uso correcto de EnsureChildControls()?
- 9. ¿Cuál es el uso de la sintaxis = =?
- 10. ¿Cuál es el uso de Log4j API?
- 11. ¿Cuál es el uso principal de MarshalByRefObject?
- 12. ¿Cuál es el uso de LOCAL_MODULE_TAGS?
- 13. ¿Cuál es el uso de typedef?
- 14. ¿Cuál es el uso de "indulgente"?
- 15. ¿Cuál es el uso de - [NSUserDefaults registerDefaults:]?
- 16. ¿cuál es el uso de string.Clone()?
- 17. ¿Cuál es el uso de Deployment.Current.Dispatcher.BeginInvoke (() => {...})?
- 18. ¿Cuál es el uso de Indexers?
- 19. ¿Cuál es el uso del uso de init() en JavaScript?
- 20. ¿Cuál es el propósito del uso?
- 21. CGRectIntegral ¿cuál es su uso?
- 22. ¿cuál es el uso de indicadores de función?
- 23. ¿Cuál es el uso de un objeto de unión constante?
- 24. Imagen de fondo de CSS: ¿Cuál es el uso correcto?
- 25. ¿Cuál es el uso de QName y clase de operador?
- 26. ¿Cuál es el uso de los mensajes de confirmación?
- 27. ¿cuál es el uso real de la interfaz en java?
- 28. ¿Cuál es el uso de campos relacionados en OpenERP?
- 29. Servlet: ¿Cuál es exactamente el uso de context.getRealPath ("");
- 30. ¿Cuál es el uso de las etiquetas en C#?
no exactamente correcto - vea la respuesta de fahd para obtener una descripción. – aperkins
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