FileLock 是 Java NIOjava.nio.channels 包中用于跨进程文件锁定的核心类。它的主要作用是在多个 JVM 进程或操作系统进程之间协调对同一个文件的并发访问防止数据竞争和文件损坏。一、核心用途- 解决多进程并发写入/读取同一文件时的数据一致性问题- 不是用于线程间同步线程间请用 synchronized、ReentrantLock 等而是进程级锁- 可以实现- 独占锁排他锁只允许一个进程写入- 共享锁允许多个进程同时读取但阻止写入✅ 适用于日志收集器、配置文件更新、临时文件互斥等场景❌ 不适用于同一个 JVM 内多个线程对文件的操作同步二、关键特性特性 说明进程级别 锁由整个 JVM 持有对其他 JVM 或本地进程可见基于操作系统 底层调用 OS 的文件锁机制如 POSIX fcntl 或 Windows LockFile劝告式Advisory为主 大多数系统上锁仅在各方都遵守协议时才有效强制锁Mandatory依赖 OS 支持区域锁定 可锁定文件的某一段position, size而非必须整个文件自动释放 锁在以下任一情况发生时释放1. 调用 FileLock.release()2. 关闭对应的 FileChannel3. JVM 退出三、常用方法来自 FileChannel// 阻塞式获取独占锁整个文件FileLock lock() throws IOException;// 阻塞式获取指定区域的锁FileLock lock(long position, long size, boolean shared) throws IOException;// 非阻塞尝试获取锁失败返回 nullFileLock tryLock();FileLock tryLock(long position, long size, boolean shared);- shared true → 共享锁只读- shared false → 独占锁读写四、简单示例写进程加独占锁try (RandomAccessFile raf new RandomAccessFile(data.txt, rw);FileChannel channel raf.getChannel()) {FileLock lock channel.lock(); // 阻塞直到获得锁raf.write(Hello from writer.getBytes());lock.release(); // 显式释放也可靠 close 自动释放}读进程尝试加共享锁try (RandomAccessFile raf new RandomAccessFile(data.txt, r);FileChannel channel raf.getChannel()) {FileLock lock channel.tryLock(0L, Long.MAX_VALUE, true); // 共享锁if (lock ! null) {// 读取数据...lock.release();} else {System.out.println(文件正被写入稍后再试);}}五、注意事项1. 不要用 FileLock 控制同 JVM 内线程同步 —— 它对同进程内无效。2. 务必释放锁否则可能导致死锁或资源泄漏。3. 某些 OS如 Windows不支持共享锁会自动转为独占锁。4. 网络文件系统NFS/SMB上文件锁可能不可靠需谨慎使用。5. tryLock() 不会阻塞适合需要快速失败的场景。六、总结FileLock 是 Java 提供的轻量级跨进程文件互斥机制比分布式锁如 Redis 锁更高效、更贴近操作系统。适用于本地多进程协作场景但需理解其“劝告式”本质和平台差异。