Programación concurrente (6): átomos atómicos (entrevista detallada)

Uno: ¿cuál es la clase de átomo?

 

 Atómico significa que una operación es ininterrumpida, incluso cuando se ejecutan varios subprocesos juntos, una vez que se inicia una operación, otros subprocesos no la interferirán.

Tipo básico

Actualizar tipos básicos utilizando métodos atómicos

  • AtomicInteger: formando clase de átomo
  • AtomicLong: tipo de átomo largo
  • AtomicBoolean: clase de átomo booleano

Tipo de matriz

Actualizar un elemento en una matriz utilizando métodos atómicos

  • AtomicIntegerArray: clase atómica de matriz entera
  • AtomicLongArray: clase de átomo de matriz de enteros largos
  • AtomicReferenceArray: clase atómica de matriz de tipo de referencia

Tipo de referencia

  • Referencia atómica: clase atómica de tipo de referencia
  • AtomicStampedReference: tipo de campo de actualización atómica en el tipo de referencia
  • AtomicMarkableReference: tipo de referencia de actualización atómica con bit de marca

Tipo de modificación de propiedad de objeto

  • AtomicIntegerFieldUpdater: Actualizador del actualizador atómico
  • AtomicLongFieldUpdater: actualizador para actualizar atómicamente campos enteros largos
  • AtomicStampedReference: tipo de referencia de actualización atómica con número de versión. Esta clase asocia valores enteros con referencias y puede usarse para resolver datos de actualización atómica y números de versión de datos, y puede resolver problemas de ABA que pueden ocurrir al usar CAS para realizar actualizaciones atómicas.

 

Dos: métodos comunes

Tome AtomicInteger como ejemplo

public final int get() //获取当前的值
public final int getAndSet(int newValue)//获取当前的值,并设置新的值
public final int getAndIncrement()//获取当前的值,并自增
public final int getAndDecrement() //获取当前的值,并自减
public final int getAndAdd(int delta) //获取当前的值,并加上预期的值
boolean compareAndSet(int expect, int update) //如果输入的数值等于预期值,则以原子方式将该值设置为输入值(update)
public final void lazySet(int newValue)//最终设置为newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

Tres: el principio de la clase AtomicInteger

 

Código fuente:

private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
    try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;

Utilice principalmente CAS (comparar e intercambiar) + métodos volátiles y nativos para garantizar operaciones atómicas.

Para más detalles, consulte el artículo sobre Comprensión del mecanismo CAS.

 

Finalmente, de acuerdo con la práctica establecida, la casa de la esposa.


 

Publicado 28 artículos originales · elogiado 0 · visitas 9931

Supongo que te gusta

Origin blog.csdn.net/weixin_38246518/article/details/105591201
Recomendado
Clasificación