Ответ
Используйте synchronized блок или ReentrantLock для синхронизации доступа к общему ресурсу.
Пример с synchronized:
private final Object lock = new Object();
public void updateSharedResource() {
synchronized (lock) {
// Критическая секция
}
}
Пример с ReentrantLock:
private final ReentrantLock lock = new ReentrantLock();
public void updateSharedResource() {
lock.lock();
try {
// Критическая секция
} finally {
lock.unlock();
}
}
Альтернативы:
Atomic-классы (AtomicInteger,AtomicReferenceи др.) для простых операций.ThreadLocal, если данные не должны быть общими.ConcurrentHashMapи другие потокобезопасные коллекции.
Выбор зависит от контекста: synchronized проще, ReentrantLock гибче (таймауты, честность).