← Назад к вопросам

Что такое принцип атомарности?

2.0 Middle🔥 201 комментариев
#SOLID и паттерны проектирования#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Принцип атомарности

Атомарность (Atomicity) — это фундаментальный принцип в программировании и системах управления базами данных, который означает, что операция либо полностью выполняется, либо полностью откатывается, без возможности частичного выполнения. Атомарность — первый принцип в ACID (Atomicity, Consistency, Isolation, Durability).

Атомарность в транзакциях БД

В контексте баз данных атомарность означает, что транзакция либо полностью завершится (commit), либо полностью откатится (rollback). Промежуточных состояний не бывает.

Пример: Передача денег между счётами

// Без атомарности — опасно!
String updateFromAccount = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";
String updateToAccount = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";

// Если произойдёт сбой между этими двумя операциями,
// деньги потеряются!

С атомарностью (транзакция):

@Transactional  // Spring управляет транзакцией
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    Account from = accountRepository.findById(fromId).orElseThrow();
    Account to = accountRepository.findById(toId).orElseThrow();
    
    from.setBalance(from.getBalance().subtract(amount));
    to.setBalance(to.getBalance().add(amount));
    
    accountRepository.save(from);
    accountRepository.save(to);
    
    // Если произойдёт исключение ДО commit,
    // ВСЕ изменения откатятся
}

Атомарность в многопоточном программировании

В Java атомарность также означает, что операция над переменной неделима — её нельзя прервать в процессе выполнения другим потоком. Для этого используются:

1. Volatile переменные (только видимость)

public class Counter {
    private volatile int count = 0;  // видимость гарантирована
    
    public void increment() {
        count++;  // НЕ атомарна! (read-modify-write из 3 операций)
    }
}

2. AtomicInteger / AtomicLong

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
    private AtomicInteger count = new AtomicInteger(0);
    
    public void increment() {
        count.incrementAndGet();  // Атомарная операция
    }
    
    public int getCount() {
        return count.get();
    }
}

Пример конкуренции без атомарности:

public class UnsafeCounter {
    private int count = 0;
    
    public void increment() {
        count++;  // 3 машинные операции: load, add, store
    }
}

// Если 2 потока вызывают increment() одновременно:
// Поток 1: load (count=0) -> add -> store (count=1)
// Поток 2: load (count=0) -> add -> store (count=1)
// Результат: count=1, но должен быть 2!

С AtomicInteger:

public class SafeCounter {
    private AtomicInteger count = new AtomicInteger(0);
    
    public void increment() {
        count.incrementAndGet();  // Атомарно!
    }
}

// Даже если 2 потока вызывают increment() одновременно,
// оба increments выполнятся корректно

3. Synchronized блоки

public class SynchronizedCounter {
    private int count = 0;
    
    public synchronized void increment() {
        count++;  // Теперь атомарна
    }
    
    public synchronized int getCount() {
        return count;
    }
}

4. Lock интерфейс

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockCounter {
    private int count = 0;
    private Lock lock = new ReentrantLock();
    
    public void increment() {
        lock.lock();
        try {
            count++;  // Защищено
        } finally {
            lock.unlock();
        }
    }
}

ACID и атомарность

Атомарность в ACID означает:

  • Все операции в транзакции либо выполнены, либо отменены
  • Нет частичных результатов
  • Система остаётся в консистентном состоянии

Когда нужна атомарность

  • Финансовые системы: переводы денег
  • Заказы: изменение статуса с проверкой запасов
  • Распределённые системы: consensus алгоритмы
  • Многопоточное ПО: защита от race conditions

Атомарность — критически важный концепт для написания надёжного и безопасного кода.