如何锁文件java
使用 FileChannel.lock() 方法
通过 FileChannel 的 lock() 方法可以锁定文件,防止其他进程访问。适用于独占锁(排他锁)。

import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
try (RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
FileChannel channel = file.getChannel();
FileLock lock = channel.lock()) { // 阻塞直到获取锁
// 在此处操作文件
} catch (Exception e) {
e.printStackTrace();
}
lock()会阻塞直到获取锁,tryLock()是非阻塞版本,立即返回null若锁不可用。- 锁在 JVM 退出或调用
lock.close()时释放。
使用 FileLock 实现共享锁
通过 lock(long position, long size, boolean shared) 指定锁的范围和类型(共享或独占)。

try (FileChannel channel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ);
FileLock lock = channel.lock(0, Long.MAX_VALUE, true)) { // 共享锁
// 多个进程可同时读取文件
} catch (IOException e) {
e.printStackTrace();
}
- 共享锁(
shared=true)允许多个进程读取,独占锁(shared=false)禁止其他进程读写。
使用 Files 类创建临时锁文件
通过创建临时文件模拟文件锁,适用于跨进程同步。
Path lockFile = Paths.get("example.lock");
try {
Files.createFile(lockFile); // 创建锁文件,若存在则抛出异常
// 操作受保护的文件
Files.deleteIfExists(lockFile); // 释放锁
} catch (IOException e) {
System.out.println("文件已被锁定");
}
- 依赖文件系统的原子性创建操作,简单但需手动清理锁文件。
注意事项
- 锁的范围:NIO 文件锁可锁定文件的一部分(
position和size参数)。 - 跨进程锁:
FileLock对同一机器上的其他进程有效,但网络文件系统可能不支持。 - JVM 退出释放:锁通常随 JVM 终止自动释放,但显式调用
close()更可靠。 - 非阻塞检查:
tryLock()适合需要快速失败逻辑的场景。
示例:非阻塞锁尝试
try (FileChannel channel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.WRITE)) {
FileLock lock = channel.tryLock();
if (lock != null) {
// 成功获取锁
} else {
System.out.println("文件已被其他进程锁定");
}
} catch (IOException e) {
e.printStackTrace();
}






