当前位置: 首页 > news >正文

FileLock

FileLock 是 Java NIO(java.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;

// 非阻塞尝试获取锁,失败返回 null

FileLock 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 锁)更高效、更贴近操作系统。适用于本地多进程协作场景,但需理解其“劝告式”本质和平台差异。

http://www.jsqmd.com/news/804075/

相关文章:

  • 2026国产数据库选型指南:OceanBase、金仓、TDSQL、GBase横向对比与决策要点
  • 拒绝压价内耗!佛山名表回收 TOP5,收的顶凭专业赢麻了 - 奢侈品回收测评
  • STT-MTJ与自旋轨道力矩TRNG技术解析与应用
  • 构建个人技能库:从代码片段到可复用技能单元的设计与实践
  • 三分钟让PowerToys说中文:微软效率工具本地化终极指南
  • 3步掌握MapleStory游戏资源编辑:HaSuite终极指南
  • 欧盟NIS2指令解析:网络安全合规从零到一的实战指南
  • 5分钟极速指南:如何将STL文件转换为STEP格式,实现3D模型的无缝对接
  • 视频即推理:多模态AI的时空图谱与物理驱动思考
  • Next.js功能开关实践:用happykit/flags实现灰度发布与A/B测试
  • AI智能体协作开发:从原型到生产的咖啡一爆检测器实战
  • Elasticsearch的shrink为啥不用软链接用硬链接
  • RAG优化续
  • 别再只会用库了!深入STM32红外接收:从NEC协议时序到GPIO中断的代码级剖析
  • 感知机:数据挖掘中的线性分类基石,感知机原理与应用全解析(附实战代码)
  • 2025届必备的十大AI辅助写作助手解析与推荐
  • OpenWord:基于多智能体架构的一句话生成互动游戏世界
  • 2026年Q2汕头老药桔选购指南:正宗鸭屎香/汕头凤凰单枞/汕头特产三兄弟猪肉脯/汕头特产老药桔/汕头特产肉脯/选择指南 - 优质品牌商家
  • 第18章 案例15:用户名密码的登陆框案例【JS流程控制】【JavaScript篇】
  • 如何快速搭建智能抢票系统:DamaiHelper新手完整实战指南
  • WeChatMsg技术架构解析:本地化微信聊天记录提取与数据主权实现方案
  • 健康160终极挂号神器:91160-cli让抢号成功率提升500%的完整指南
  • 2026年深圳钻石回收别被坑,收的顶报价透明,钻戒项链手镯耳坠多卖 30% - 奢侈品回收测评
  • 新高考下志愿填报实用攻略:扬州机构资源与选型建议 - 品牌推荐大师
  • 全球与中国干混砂浆市场:现状剖析与未来趋势前瞻
  • powershell使用笔记、.ps1是什么文件
  • 银川铁艺护栏哪家专业?宁夏路弘——本地源头工厂,适配各类场景需求 - 宁夏壹山网络
  • 【研报 A116】智能体技术趋势:多模态处理+循环验证,推动企业workflow自动化
  • 如何快速掌握FastGithub:面向开发者的GitHub加速完整指南
  • NeuroSynth脑成像元分析:用Python解锁神经科学研究的强大工具