2012-07-23 1 views
2

У меня есть некоторые путаницы в блокировке файла java.Java, одновременно получающий доступ к файлу среди потоков

это моё состояние.

  1. Каждый поток может читать/записывать файл.
  2. Мой файл манипулируя метод может быть вызван несколькими потоками одновременно

и моя цель ясна, не одновременно запись в файл с помощью нитей. Всегда один поток разрешал писать файл.

Мои вопросы

  1. Если FileOutputStream.write() был поточно, у меня не было поставить какой-либо механизм параллельности в моем коде, так как код в записи() не будет блокировать до тех пор, запертый файл будет выпущен. Тем не менее, моя программа, похоже, не блокирует, когда файл открывается потоком (я не уверен в этом)

  2. Если FileOutputStream.write() не был потокобезопасным, мне пришлось бы написать дополнительный код, чтобы сделать файл, к которому обращается только поток за раз. Поэтому я использовал FileChannel.lock() для этого. Однако, в отличие от документа JDK, он не блокирует, а создает исключение OverlappingFileLockException.

Буду признателен за ваш четкий совет.

+0

FWIW FileChannel # lock блокируется * другими процессами * не синхронизировать между потоками одного и того же JVM: http://stackoverflow.com/questions/128038/how-can-i-lock-a-file-using -java-if-possible – Thilo

+0

Благодаря вашей ссылке. Итак ... FileChannel.lock() действителен только для процессов, а не для потоков? и мне действительно нужно использовать синхронизационный подход ... правильно? –

ответ

1

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

+0

Синхронизированный блок по методу не является моим вариантом, как вы упомянули. Чтение/запись файлов - основная работа в моем приложении. Если каждый поток обращается к различным файлам, их не нужно синхронизировать. Я надеюсь, что метод write() заблокирован, когда файл открывается с наименьшим дополнительным кодом. если это невозможно, мне нужно будет определить, к какому файлу обращается мой поток (совпадение строк ... и т. д.) –

+0

Вы могли бы использовать синхронизированный блок для использования какого-либо объекта, представляющего файл как блокировку. Не обязательно быть глобальным. – Thilo

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

  • Нет связанных вопросов^_^