Ответ
Многопоточный доступ к одному файлу возникает, когда несколько потоков приложения пытаются читать или записывать данные в один файл одновременно. Это приводит к состоянию гонки (race condition) и может вызвать:
- Повреждение данных
- Непредсказуемое поведение
- Исключения (например,
IOException)
Типичные сценарии:
-
Веб-приложение с общим лог-файлом
// Небезопасно: несколько HTTP-запросов пишут в один файл public void logToFile(String message) { try (FileWriter fw = new FileWriter("app.log", true)) { fw.write(message + "n"); } } -
Кэширование данных в файл
// Потоки обновляют общий кэш-файл public void updateCache(String key, String value) { // Чтение текущего кэша // Модификация данных // Запись обратно в файл } -
Конфигурационный файл, обновляемый в runtime
Решение: Используйте синхронизацию или атомарные операции:
// Вариант 1: synchronized
public synchronized void safeWrite(String data) {
// запись в файл
}
// Вариант 2: Lock
private final ReentrantLock lock = new ReentrantLock();
public void safeWriteWithLock(String data) {
lock.lock();
try {
// запись в файл
} finally {
lock.unlock();
}
}
// Вариант 3: Использование java.nio.channels.FileLock
Лучшая практика: Для логов используйте специализированные библиотеки (Log4j2, Logback), которые уже решают проблему конкурентного доступа.