java.nio.channels.FileChannel将允许您使用底层文件系统的本地方法获取文件上的FileLock,假设支持此类功能。
此锁跨机器上的进程运行,甚至是非 java 进程。(实际上,锁是代表特定的 JVM 实例持有的,因此不适合管理一个进程中的多个线程之间的争用,或者同一个 JVM 中的多个进程之间的争用)。
这里有很多警告,但如果您在 Windows 上工作,则值得研究。
从javadoc:
此文件锁定 API 旨在直接映射到底层操作系统的本机锁定设施。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的。
锁是否实际上阻止另一个程序访问锁定区域的内容是系统相关的,因此未指定。某些系统的本机文件锁定工具只是建议性的,这意味着程序必须协同遵守已知的锁定协议以保证数据完整性。在其他系统上,本地文件锁是强制性的,这意味着如果一个程序锁定了文件的某个区域,那么实际上会阻止其他程序以违反锁的方式访问该区域。在其他系统上,本机文件锁是建议性的还是强制性的,可以根据每个文件进行配置。为确保跨平台的一致和正确行为,强烈建议将此 API 提供的锁用作建议锁。
在某些系统上,获取文件区域的强制锁定会阻止该区域映射到内存中,反之亦然。结合锁定和映射的程序应该为这种结合失败做好准备。
在某些系统上,关闭通道会释放 Java 虚拟机在底层文件上持有的所有锁,无论这些锁是通过该通道还是通过同一文件上打开的另一个通道获得的。强烈建议在程序中使用唯一通道来获取任何给定文件上的所有锁。
某些网络文件系统仅在锁定区域是页面对齐的并且是底层硬件页面大小的整数倍时才允许对内存映射文件使用文件锁定。某些网络文件系统不会在超出某个位置(通常为 230 或 231)的区域上实现文件锁定。通常,在锁定驻留在网络文件系统上的文件时应格外小心。