2012-01-30 3 views
1

У меня есть статический служебный класс, FileUtils который имеет следующий метод:Параллельный поток I/O доступ

public static Object readDataFromInternalStorage(String fileName) 
{...} 

public static synchronized void 
      writeDataToInternalStorage(Serializable theData, String fileName) 
{...} 

Я сталкиваясь с нечетным java.io.EOFException в моем методе чтения при попытке чтения из внутренних место хранения. Это многопоточное приложение, в котором несколько потоков могут одновременно обращаться к этому коду (хотя это не обычный случай). Немного подумав об этом, мое подозрение заключается в том, что при чтении файла появляется еще один поток и записывается в файл до завершения чтения, тем самым искажая чтение. Правильно ли мое предположение?

Предполагая, что это лучший способ исправить это? Является ли ответ просто добавлением «synchonized» в мой метод чтения, который, если я читаю this post, правильно блокирует весь класс?

ответ

2

Возможно, ваше предположение верно; одновременная запись во время чтения может вызвать всевозможные проблемы.

Одним из вариантов является синхронизация чтения, но, как вы говорите, это позволит одновременно использовать только одного считывателя или записи. Другой вариант - использовать ReentrantReadWriteLock для управления чтением и записью. Это сложнее в использовании, но гораздо более гибко, что позволяет использовать несколько одновременных читателей и эксклюзивных авторов.

+0

Большое спасибо. Его довольно непривычно, что в моем коде было бы два потока читать или писать одновременно, поэтому я думаю, что я буду придерживаться более простого решения синхронизации чтения, но спасибо за ReentrantReadWriteLock. Выглядит очень интересно, будет помнить о будущем –

1

Предполагая, что вы закрываете дескрипторы файлов до конца соответствующих методов, добавление к вашему методу чтения должно обеспечивать чтение или запись только одного потока за раз. Конечно, вы также должны убедиться, что другие методы в вашем приложении не читают и не записывают в один и тот же файл.

+0

спасибо. Все файлы ввода/вывода для моего приложения проходят через этот код, так что хорошо идти. –

1

Не могу сказать наверняка, но возможно, что вы видите повреждение в чтении, основанное на одновременной записи в тот же файл. В общем, вам нужно синхронизировать такой доступ к одному файлу несколькими потоками. И да, синхронизация метода чтения сделает это для вас. Существуют и другие потенциальные решения, но пока вы не найдете необходимость идти по более сложному пути, это может быть вашим лучшим выбором.

Смежные вопросы