文件锁-FileLock
最近在看flume部分功能的源码,关于FileLock的使用,其实在很多开源框架都有涉及,我所看过的有lucene,zookeeper,hadoop,es等开源框架都有用到,下面简单的介绍下FileLock。
1,FileLock是独占锁,控制不同程序(JVM)对同一文件的并发访问。
2,可以对写文件(w)加锁,而且必须是可写文件,不然回报:java.nio.channels.NonWritableChannelException异常,这样可以保证只有同一个进程才能拿到锁对文件访问。其他进程无法访问改文件,或者删除该文件的目录。
3,由于是独占锁,所以可以保证进程间顺序访问该文件,避免数据错误。s
4,FileLock的生命周期,在调用FileLock.release(),或者Channel.close(),或者JVM关闭,则生命周期结束。
5,FileLock的lock和tryLock只能调用一次,释放后才能继续获得锁。
java.io.File.deleteOnExit() 在FileLock生命周期结束是,文件被删除,一般会用于临时文件的删除。强制关闭虚拟机,是不会删除文件的。测试代码:
public static void main(String[] args) throws IOException {File f = null;try {f = File.createTempFile("tmp", ".txt");System.out.println("Path: " + f.getAbsolutePath());f.deleteOnExit();f = File.createTempFile("tmp", null);System.out.print("Path: " + f.getAbsolutePath());f.deleteOnExit();} catch (Exception e) {e.printStackTrace();}}
获取了FileLock独占锁的文件,通过delete是无法删除的,可以通过deleteOnExit()在FileLock生命周期结束的时候删除,测试代码:
FileLock fileLock = null;File file = new File("D:\\trylock\\", "fish.lock");RandomAccessFile randAccessfile = new RandomAccessFile(file, "rws");// 获取独占锁,阻塞的方法,当文件锁不可用时,当前进程会被挂起// randAccessfile.getChannel().lock();// 获取独占锁,非阻塞的方法,当文件锁不可用时,tryLock()会得到null值fileLock = randAccessfile.getChannel().tryLock();if (fileLock != null && file.isDirectory()) {file.delete();} else if (fileLock != null && file.isFile()) {
// file.delete();// 删除没效果,必须使用deleteOnExitfile.deleteOnExit();// 虚拟机退出,就删除了}if (fileLock == null) {return;} else {fileLock.release();fileLock.channel().close();fileLock = null;}
Flume中的使用:
private FileLock tryLock(File dir) throws IOException {File lockF = new File(dir, FILE_LOCK);lockF.deleteOnExit();RandomAccessFile file = new RandomAccessFile(lockF, "rws");FileLock res = null;try {res = file.getChannel().tryLock();} catch(OverlappingFileLockException oe) {file.close();return null;} catch(IOException e) {LOGGER.error("Cannot create lock on " + lockF, e);file.close();throw e;}return res;}
文件锁-FileLock相关推荐
- Java 进程间文件锁FileLock详解
转载自 Java 进程间文件锁FileLock详解 最近需要在两个进程中对同一个文件进行操作,正好Java 提供了文件锁FileLock类,利用这个类可以控制不同程序(JVM)对同一文件的并发访问, ...
- JAVA 文件锁 FileLock
概述 FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问:而其它拿不到锁的进程要么选择被挂起 ...
- python filelock 文件锁_详解进程文件锁FileLock
import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; i ...
- Linux文件锁(Filelock)是什么,怎么用?
文件锁 为了解决并发对文件IO操作的影响,这样就出现了文件锁,多个进程如果在没有设置文件锁的情况下是可以访问同一个文件的,比如我一个进程已经开始写这个文件了,那么另外一个进程也可以写,那这样不就乱套了 ...
- 【转载保存】索引文件锁LockFactory
索引文件锁LockFactory LockFactory在Lucene中用来对索引文件所在的目录进行加锁,使得同一时间总是只有一个IndexWriter对象可以更改索引文件,即保证单进程内(sin ...
- class转java_[拒绝套路,纯干货]这一百多道 Java 基础问题你掌握了吗?
码农每日一题长按关注,工作日分享一些技术知识点. [每日一题]Java 基本数据类型基础面试题 [每日一题]Java 包装类型装箱拆箱基础面试题 [每日一题]Java 字符串(Part 1)相关面试题 ...
- NIO 之 FileChannel
概述 文件通道总是阻塞式的,因此不能被置于非阻塞模式.现代操作系统都有复杂的缓存和预取机制,使得本地磁盘 I/O 操作延迟很少.网络文件系统一般而言延迟会多些,不过却也因该优化而受益. 面向流的 I/ ...
- 微信机、网络和java的相关知识点
TCP/IP体系和OSI参考模型 TCP/IP体系的网际层及其协议 网际协议(IP) Internet控制报文协议 地址解析协议 反向地址解析协议(RARP) 动态主机配置协议 TCP/IP体系的传输 ...
- dcase_util教程(二)——各单元介绍
接着上一篇教程,继续的有各个UTILITIES的介绍.网址 1. Container 数据容器的类.这些数据的目的是为了包装数据,使用有用的方法来访问和操作数据,以及加载和存储数据. 这些容器是从标准 ...
最新文章
- Enhancement spot 增强点简介
- 同一域名下部署多个vue项目
- Nginx高并发系统内核优化
- 免费申请 Office365 E5 开发者订阅
- python算法实验是什么_PCA 算法实验代码(python)
- 2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,比较有研究潜力?
- 【事件驱动】【数码管识别】一(数码管检测(矩形检测函数解读))
- 拓端tecdat|matlab使用移动平均滤波器、重采样和Hampel过滤器进行信号平滑处理
- linux下编译运行驱动
- CocosCreator编辑器界面
- 车辆管理系统 c++
- Vue入门之vue框架简介库和框架的区别MVVM介绍安装vuevue所管理的边界双向数据绑定vue事件vue的生命周期
- 二叉树多种遍历的时间复杂度和空间复杂度
- 计算机网络技术在实践中应用,计算机网络技术及在实践中的具体应用
- 使用CXF+Spring发布WebService,启动报错
- 常见的HTPP状态码
- 基于域名的虚拟主机配置
- 丁香园php岗_丁香园面试药学新闻编辑岗位体悟
- Windows蓝屏代码含义速查
- 对一些内存名词术语的解释(bank ECC等)——转载