Capacitación en Java de Beida Jade Bird: ¿Clases y colecciones de uso común en la programación concurrente de Java?
Las instancias de las clases AtomicBoolean, AtomicInteger, AtomicLong y AtomicReference proporcionan acceso y actualizaciones de variables individuales del tipo correspondiente.
Institución de formación de cursos de Java/cree que el principio básico es utilizar la operación CAS: BooleanCompareandSet (valor esperado, valor de actualización); si este método (con diferentes tipos de parámetros entre diferentes clases) actualmente tiene el valor esperado, entonces esto La variable se establece automáticamente en updateValue y se informa verdadero si se realiza correctamente.
Bucle ca, consulte el entero atómico: publicfinalingtandrement(){ for(;;){ int current = get(); int next = current 1 if (compareAndSet(current, next)) return current; } } publicfinalbooleancompareAndSet(int expect, int update){ return unsafe . compareandswapint(this, valueOffset, expect, update); } Problema de ABA porque CAS necesita verificar si el valor ha cambiado al operar el valor. pero si a El valor resulta ser A, cuando use CAS para verificarlo, encontrará que su valor no ha cambiado, pero en realidad ha cambiado.
La solución al problema de ABA es utilizar números de versión.
Agregue el número de versión antes de la variable. Cada vez que se actualiza la variable, el número de versión aumenta en uno, por lo que A-B-A se convierte en 1A-2B-3A.
A partir de Java 1.5, el paquete atómico del JDK proporciona una clase AtomicStampedReference para resolver el problema ABA.
El método compareAndSet de esta clase se utiliza para verificar primero si la referencia actual es igual a la referencia esperada y si el indicador actual es igual al indicador esperado. Si ambos son iguales, establece atómicamente el valor de la referencia y el indicador al valor actualizado dado.
Cola de bloqueo delimitada soportada por la matriz ArrayBlockingQueue.
La cola clasifica los elementos según el principio FIFO (primero en entrar, primero en salir).
El jefe de cola es el elemento que lleva más tiempo en la cola.
La cola de la cola es el elemento que menos tiempo ha permanecido en la cola.
Los nuevos elementos se insertan al final de la cola y la operación de recuperación de la cola comienza desde el principio de la cola.
Este es un típico "búfer delimitado", donde una matriz de tamaño fijo contiene elementos insertados por el productor y extraídos por el usuario.
Una vez creado dicho buffer, su capacidad no se puede aumentar.
Intentar colocar un elemento en una cola llena bloqueará la operación; intentar extraer un elemento de una cola vacía provocará un bloqueo similar.
Esta clase admite una política de equidad opcional que ordena los hilos de productor y consumidor en espera.
Por defecto, esta clasificación no está garantizada.
Sin embargo, las colas construidas estableciendo la equidad en verdadero permiten el acceso a los subprocesos en orden FIFO.
La equidad generalmente reduce el rendimiento, pero también reduce la variabilidad y evita el "desequilibrio".
Linkedblockingqueue es una cola de bloqueo basada en cualquier rango de nodos vinculados.
Esta cola ordena los elementos según FIFO (primero en entrar, primero en salir).
El jefe de cola es el elemento que lleva más tiempo en la cola.
El final de la cola es el elemento que menos tiempo ha permanecido en la cola.
El nuevo elemento se inserta al final de la cola y la operación de adquisición de cola obtendrá el elemento al principio de la cola.
Las colas vinculadas generalmente tienen un rendimiento mayor que las colas basadas en matrices, pero su rendimiento es menos predecible en la mayoría de las aplicaciones concurrentes.
El parámetro constructor de rango de capacidad opcional se utiliza como una forma de evitar que la cola se extienda demasiado.
Si no se especifica la capacidad, es igual a un número entero. MAX_VALUE.
A menos que la inserción de un nodo provoque que la cola exceda su capacidad, se crea dinámicamente un nodo de enlace después de cada inserción.
Si el objeto LinkedBlockingQueue se construye sin especificar su capacidad, LinkedBlockingQueue tendrá de forma predeterminada una capacidad ilimitada (entero. MAX_VALUE). En este caso, si el productor es más rápido que el consumidor, el sistema puede quedarse sin memoria antes de que se llene la cola.