Sobes.tech
Middle

Qual é a diferença entre volatilidade e atomicidade no contexto da programação multithread?

sobes.tech IA

Resposta da IA

volatile garante a visibilidade das alterações de uma variável por todos os threads. Quando um thread escreve um valor numa variável volatile, essa alteração torna-se imediatamente visível para outros threads. Também proíbe a reordenação de operações de leitura e escrita para variáveis volatile.

Operações atómicas (classes atómicas no pacote java.util.concurrent.atomic) garantem que uma operação sobre uma variável seja executada como uma unidade indivisível e não possa ser interrompida por outro thread. Isto assegura a correção das operações de incremento, decremento e Compare-And-Swap sem usar synchronized.

Diferença chave: volatile apenas garante a visibilidade, mas não a atomicidade de operações compostas (por exemplo, i++ — que é leitura, incremento e escrita). As classes atómicas garantem tanto a atomicidade de operações individuais como a visibilidade.

Exemplo:

class VolatileCounter {
    volatile int count = 0;

    public void increment() {
        // Esta operação NÃO é atómica
        count++;
    }
}

class AtomicCounter {
    java.util.concurrent.atomic.AtomicInteger count = new java.util.concurrent.atomic.AtomicInteger(0);

    public void increment() {
        // Esta operação É ATÓMICA
        count.incrementAndGet();
    }
}