Ответ
Потокобезопасность — это свойство кода, гарантирующее корректное поведение и целостность данных при одновременном выполнении в нескольких потоках.
Важность: Без потокобезопасности возникают:
- Состояния гонки (Race Conditions): Непредсказуемый результат из-за порядка выполнения потоков.
- Повреждение данных: Несогласованное изменение общих ресурсов.
- Нарушение инвариантов: Объект переходит в некорректное состояние.
Пример проблемы (не потокобезопасный код):
class UnsafeCounter {
private int count = 0;
public void increment() {
count++; // Неатомарная операция (чтение-изменение-запись)
}
}
Способы обеспечения потокобезопасности:
- Использование потокобезопасных классов из
java.util.concurrent:private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); // Атомарная операция } - Синхронизация доступа: Ключевое слово
synchronizedили объектыLock(ReentrantLock). - Иммутабельность: Использование
finalполей и создание неизменяемых объектов. - Ограничение видимости: Использование локальных переменных или
ThreadLocal. - Потокобезопасные коллекции:
ConcurrentHashMap,CopyOnWriteArrayList.
Важно: Избыточная синхронизация может привести к взаимным блокировкам (deadlocks) и снижению производительности.