FileLock是Java中基于操作系统实现的进程级文件锁,用于多进程间协调文件访问,分为排他锁和共享锁,需通过FileChannel获取,属建议性锁且不保证JVM内线程安全。

Java 中的 FileLock 是基于操作系统的文件锁机制,用于在多进程(而非仅多线程)场景下协调对同一文件的访问。它不能保证 JVM 内部线程安全,但能防止不同 JVM 进程或外部程序同时修改文件,是真正意义上的“文件级锁定”。
FileLock 只能通过 FileChannel 获取,不支持传统 FileInputStream/FileOutputStream 直接加锁。它分为两种类型:
注意:锁是建议性(advisory)的 —— 它只对主动调用 lock() 或 tryLock() 的程序生效;绕过 Java、直接用系统命令(如 cp、echo >)操作文件时,锁不会起作用。
典型代码结构如下(以排他锁为例):
立即学习“Java免费学习笔记(深入)”;
RandomAccessFile raf = new RandomAccessFile("data.txt", "rw");
FileChannel channel = raf.getChannel();
FileLock lock = null;
try {
// 尝试非阻塞获取排他锁(从文件开头到末尾)
lock = channel.lock(0, Long.MAX_VALUE, false);
// ✅ 此时其他进程调用 lock() 会被阻塞,tryLock() 会返回 null
// 执行读写操作(例如写入时间戳)
raf.writeBytes("Updated at " + System.currentTimeMillis() + "\n");
} catch (IOException e) {
// 处理锁失败或 I/O 异常
} finally {
if (lock != null && lock.isValid()) {
try {
lock.release(); // 显式释放锁
} catch (IOException ignored) {}
}
try {
channel.close();
raf.close();
} catch (IOException ignored) {}
}关键点:
channel.lock() 会阻塞直到获得锁;用 channel.tryLock() 立即返回 null(失败)或锁对象(成功);lock(position, size, shared) 精确控制(如只锁文件第 100–200 字节);release() 更清晰可控;实际使用中容易踩坑的地方:
lock(),也会阻塞或失败(取决于是否已持锁);FileChannel 打开同一文件,仍可各自尝试加锁(操作系统层面才真正互斥);FileLock 替代数据库事务或应用层并发控制 —— 它粒度粗、功能弱、跨平台行为不一致。如果目标是解决以下问题,FileLock 往往不是最佳选择:
synchronized、ReentrantLock 或线程安全的 IO 工具类;Files.createFile()(利用原子性)更轻量可靠。基本上就这些。FileLock 有用,但适用面窄;用对了能避坑,用错了反而增加不确定性。
以上就是Java里如何使用FileLock进行文件级锁定_Java文件锁机制解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号