我正在构建一个Java应用程序来处理本地FS上的文件(NTFS,但将来可以轻松扩展到Linux文件系统的解决方案会很好)。问题是,如果我的应用程序的两个实例(进程)同时运行,则单个文件不能被处理多次。锁定本地FS上的文件
好像我需要锁定每个文件,然后再处理它。该应用程序不使用数据库,仅用于锁定目的似乎并不方便。
所以我在考虑追加一个后缀到文件名。问题是,如何(如果有可能)询问文件名是否以后缀结尾,然后以原子方式追加后缀。
其他技巧,以实现我所需要的也是赞赏。
我正在构建一个Java应用程序来处理本地FS上的文件(NTFS,但将来可以轻松扩展到Linux文件系统的解决方案会很好)。问题是,如果我的应用程序的两个实例(进程)同时运行,则单个文件不能被处理多次。锁定本地FS上的文件
好像我需要锁定每个文件,然后再处理它。该应用程序不使用数据库,仅用于锁定目的似乎并不方便。
所以我在考虑追加一个后缀到文件名。问题是,如何(如果有可能)询问文件名是否以后缀结尾,然后以原子方式追加后缀。
其他技巧,以实现我所需要的也是赞赏。
你也许可以利用文件重命名操作在大多数文件系统上是原子的事实。你的逻辑可能是这样的:
我想我会走这条路。谢谢! – 2012-02-07 14:20:27
像这样的东西应该工作:
File someFile = new File(path);
if (!someFile.getName().endsWith(".locked")) {
File lockedFile = new File(someFile.getAbsolutePath() + ".locked");
someFile.renameTo(lockedFile);
}
这会真的起作用吗?还是会有竞争条件,因为“测试和重命名”操作不是原子的? – 2012-02-07 14:02:59
为什么不以独占模式打开该文件,并把它打开(另一个实例只是将无法打开它,然后)? – 2012-02-07 19:03:26