Ответ
Консистентность (согласованность) — это свойство системы, гарантирующее, что данные всегда находятся в допустимом, корректном состоянии, даже при параллельных операциях или сбоях. Она обеспечивает соблюдение всех заданных правил, ограничений и инвариантов.
Уровни консистентности:
- Строгая (Strong): Любое чтение возвращает результат самой последней завершённой записи.
- Последовательная (Sequential): Операции всех процессов видны в одном порядке.
- Конечная (Eventual): При отсутствии новых записей система в конечном счёте приходит к согласованному состоянию (характерно для распределённых систем, согласно CAP-теореме).
Как достигается в Java-приложениях?
Через механизмы синхронизации:
- Ключевое слово
synchronized. - Модификатор
volatile. - Классы из
java.util.concurrent.locks(например,ReentrantLock). - Потокобезопасные коллекции (
ConcurrentHashMap,CopyOnWriteArrayList).
Пример нарушения и обеспечения консистентности:
// НЕКОНСИСТЕНТНЫЙ счётчик (гонка данных)
class UnsafeCounter {
private int count = 0;
public void increment() { count++; } // Неатомарная операция!
public int get() { return count; }
}
// КОНСИСТЕНТНЫЙ счётчик с синхронизацией
class SafeCounter {
private int count = 0;
public synchronized void increment() { count++; } // Атомарная операция
public synchronized int get() { return count; }
}
Без синхронизации два потока, одновременно вызывающие increment(), могут прочитать одно значение, увеличить его и записать обратно, что приведёт к потере одного обновления.