Java
Сложный
Какие проблемы многопоточности существуют в Java?
Проблемы многопоточности в Java
1. Race Condition
Результат зависит от порядка выполнения потоков.
// ПРОБЛЕМА
class Counter {
private int count = 0;
public void increment() {
count++; // Не атомарно: read-modify-write
}
}
// РЕШЕНИЕ
class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // Атомарно
}
}
2. Deadlock
Потоки блокируют друг друга навечно.
// ПРОБЛЕМА
Object lock1 = new Object();
Object lock2 = new Object();
// Thread 1
synchronized(lock1) {
synchronized(lock2) { } // Ждёт lock2
}
// Thread 2
synchronized(lock2) {
synchronized(lock1) { } // Ждёт lock1
}
// РЕШЕНИЕ: единый порядок захвата блокировок
3. Livelock
Потоки активны, но не продвигаются.
// Оба потока "уступают" друг другу бесконечно
while (resourceInUse) {
Thread.sleep(random()); // Добавить случайную задержку
}
4. Starvation
Поток не получает ресурсы из-за приоритетов.
// Низкоприоритетный поток не получает CPU
thread.setPriority(Thread.MIN_PRIORITY);
// РЕШЕНИЕ: использовать fair locks
ReentrantLock lock = new ReentrantLock(true); // fair=true
5. Visibility Problem
Изменения не видны другим потокам.
// ПРОБЛЕМА
class Flag {
private boolean running = true; // Может быть закэширован
public void stop() { running = false; }
public void run() {
while (running) { } // Может не увидеть изменение
}
}
// РЕШЕНИЕ
private volatile boolean running = true;
6. False Sharing
Разные переменные в одной cache line.
// ПРОБЛЕМА
class Data {
volatile long a; // Могут быть в одной cache line
volatile long b;
}
// РЕШЕНИЕ (Java 8+)
class Data {
@Contended
volatile long a;
@Contended
volatile long b;
}
Инструменты решения:
| Проблема | Решение |
|---|---|
| Race Condition | synchronized, Atomic*, Lock |
| Deadlock | Единый порядок блокировок |
| Visibility | volatile, synchronized |
| Starvation | Fair locks |
Concurrent Collections:
ConcurrentHashMap<K, V> // Thread-safe Map
CopyOnWriteArrayList<E> // Thread-safe List
BlockingQueue<E> // Очередь с блокировкой
Похожие вопросы
Готовитесь к собеседованию?
ENIGMA AI — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно