ti-enxame.com

O que "atômico" significa em programação?

No livro Java efetivo, ele afirma:

A especificação da linguagem garante que a leitura ou escrita de uma variável seja atômica, a menos que a variável seja do tipo long ou double [JLS, 17.4.7].

O que "atômico" significa no contexto de programação Java ou programação em geral?

230
James

Aqui está um exemplo, porque um exemplo é geralmente mais claro do que uma longa explicação. Suponha que foo seja uma variável do tipo long. A seguinte operação não é uma operação atômica:

foo = 65465498L;

De fato, a variável é escrita usando duas operações separadas: uma que grava os primeiros 32 bits e outra que grava os últimos 32 bits. Isso significa que outro thread pode ler o valor de foo e ver o estado intermediário.

Tornar a operação atômica consiste em utilizar mecanismos de sincronização para garantir que a operação seja vista, de qualquer outro segmento, como uma operação única, atômica (ou seja, não divisível em partes). Isso significa que qualquer outro segmento, uma vez que a operação seja feita atômica, verá o valor de foo antes da atribuição ou após a atribuição. Mas nunca o valor intermediário.

Uma maneira simples de fazer isso é fazer o variável volátil :

private volatile long foo;

Ou para sincronizar todos os acessos à variável:

public synchronized void setFoo(long value) {
    this.foo = value;
}

public synchronized long getFoo() {
    return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized

Ou para substituí-lo por um AtomicLong :

private AtomicLong foo;
327
JB Nizet

"Operação atômica" significa uma operação que parece ser instantânea da perspectiva de todos os outros segmentos. Você não precisa se preocupar com uma operação parcialmente completa quando a garantia se aplica.

49
H2ONaCl

É algo que "parece ao resto do sistema ocorrer instantaneamente", e se enquadra na categorização de Linearizability em processos de computação. Para citar mais esse artigo vinculado:

A atomicidade é uma garantia de isolamento dos processos concorrentes. Além disso, operações atômicas geralmente têm uma definição de sucesso ou falha - elas alteram com sucesso o estado do sistema ou não têm efeito aparente.

Assim, por exemplo, no contexto de um sistema de banco de dados, pode-se ter 'commits atômicos', o que significa que você pode enviar um changeset de atualizações para um banco de dados relacional e todas as alterações serão submetidas, ou nenhuma delas em o evento de falha, desta forma, os dados não se tornam corruptos e, conseqüentemente, de bloqueios e/ou filas, a próxima operação será uma gravação ou leitura diferente, mas somente após o fato. No contexto de variáveis ​​e encadeamento, isso é praticamente o mesmo, aplicado à memória.

Sua citação destaca que essa necessidade não é um comportamento esperado em todas as instâncias.

21
Grant Thomas

Acabei de encontrar um post Atomic vs. Non-Atomic Operations para ser muito útil para mim.

"Uma operação agindo na memória compartilhada é atômica se for concluída em uma única etapa em relação a outros segmentos.

Quando um armazenamento atômico é executado em uma memória compartilhada, nenhum outro segmento pode observar a modificação pela metade.

Quando uma carga atômica é executada em uma variável compartilhada, ela lê o valor inteiro como ele apareceu em um único momento no tempo. "

11
Kurt Zhong

Se você tiver vários segmentos executando os métodos m1 e m2 no código abaixo:

class SomeClass {
    private int i = 0;

    public void m1() { i = 5; }
    public int m2() { return i; }
}

você tem a garantia de que qualquer thread que esteja chamando m2 irá ler 0 ou 5.

Por outro lado, com este código (onde i é um longo):

class SomeClass {
    private long i = 0;

    public void m1() { i = 1234567890L; }
    public long m2() { return i; }
}

um encadeamento chamado m2 poderia ler 0, 1234567890L ou algum outro valor aleatório porque a instrução i = 1234567890L não é garantida como atômica para um long (uma JVM poderia gravar os primeiros 32 bits e os últimos 32 bits em duas operações e um encadeamento poderia observar i entre).

11
assylias