Возможно, нет необходимости в блокировке. Я не слишком знаком с API FS в Windows, но поскольку NTFS поддерживает как жесткие, так и программные ссылки AFAIK, вы можете попробовать это, если ваша настройка позволяет:
Используйте жесткую или программную ссылку, чтобы указать на фактический файл, и назовите файл по-другому. Разрешить всем доступ к файлу по имени ссылки.
Запишите новый файл под другим именем, в ту же папку.
Когда он закончится, укажите файлу новый файл. Оптимально, Windows позволит вам создать новую ссылку с заменой существующей ссылки в одной атомарной операции. Тогда у вас будет ссылка, которая всегда идентифицирует действительный файл, старый или новый. В худшем случае вам придется сначала удалить старый файл, а затем создать ссылку на новый файл. В этом случае будет короткий промежуток времени, в течение которого программа не сможет найти файл. (Кроме того, Mac OS X предлагает функцию «ExchangeObjects», которая позволяет атомарно менять два элемента - возможно, Windows предлагает что-то похожее).
Таким образом, любая программа, у которой уже открыт старый файл, продолжит обращаться к старому, и вы не будете мешать созданию нового. Только если приложение замечает существование новой версии, оно может закрыть текущую и открыть ее снова, таким образом получая доступ к новой версии.
Однако я не знаю, как создавать ссылки в Java. Может быть, вам придется использовать какой-то нативный API для этого.
Надеюсь, это поможет в любом случае.