Programação simultânea (6): átomos atômicos (entrevista detalhada)

Um: qual é a classe atom

 

 Atômica significa que uma operação é ininterrupta, mesmo quando vários encadeamentos são executados juntos, quando uma operação é iniciada, ela não será interferida por outros encadeamentos.

Tipo básico

Atualizar tipos básicos usando métodos atômicos

  • AtomicInteger: moldando a classe atom
  • AtomicLong: Tipo de átomo longo
  • AtomicBoolean: Classe de átomos booleanos

Tipo de matriz

Atualizar um elemento em uma matriz usando métodos atômicos

  • AtomicIntegerArray: classe atômica da matriz inteira
  • AtomicLongArray: Classe atômica de matriz inteira longa
  • AtomicReferenceArray: Classe atômica da matriz do tipo de referência

Tipo de referência

  • AtomicReference: Classe atômica do tipo de referência
  • AtomicStampedReference: Tipo de campo de atualização atômica no tipo de referência
  • AtomicMarkableReference: tipo de referência de atualização atômica com bit de marca

Tipo de modificação da propriedade do objeto

  • AtomicIntegerFieldUpdater: atualizador do atualizador atômico
  • AtomicLongFieldUpdater: atualizador para atualizar atomicamente campos inteiros longos
  • AtomicStampedReference: Tipo de referência de atualização atômica com número da versão. Esta classe associa valores inteiros a referências e pode ser usada para resolver dados de atualização atômica e números de versão de dados.É possível resolver problemas ABA que podem ocorrer ao usar o CAS para executar atualizações atômicas.

 

Dois: métodos comuns

Tome AtomicInteger como um exemplo

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 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值。

Três: O princípio da classe AtomicInteger

 

Código fonte:

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;

Use principalmente CAS (comparar e trocar) + métodos voláteis e nativos para garantir operações atômicas.

Para detalhes, consulte o artigo Entendendo o Mecanismo CAS.

 

Finalmente, de acordo com a prática estabelecida, a casa da esposa.


 

Publicado 28 artigos originais · elogiado 0 · visitas 9931

Acho que você gosta

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