最近在看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相关推荐

  1. Java 进程间文件锁FileLock详解

    转载自  Java 进程间文件锁FileLock详解 最近需要在两个进程中对同一个文件进行操作,正好Java 提供了文件锁FileLock类,利用这个类可以控制不同程序(JVM)对同一文件的并发访问, ...

  2. JAVA 文件锁 FileLock

    概述 FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问:而其它拿不到锁的进程要么选择被挂起 ...

  3. python filelock 文件锁_详解进程文件锁FileLock

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; i ...

  4. Linux文件锁(Filelock)是什么,怎么用?

    文件锁 为了解决并发对文件IO操作的影响,这样就出现了文件锁,多个进程如果在没有设置文件锁的情况下是可以访问同一个文件的,比如我一个进程已经开始写这个文件了,那么另外一个进程也可以写,那这样不就乱套了 ...

  5. 【转载保存】索引文件锁LockFactory

    索引文件锁LockFactory   LockFactory在Lucene中用来对索引文件所在的目录进行加锁,使得同一时间总是只有一个IndexWriter对象可以更改索引文件,即保证单进程内(sin ...

  6. class转java_[拒绝套路,纯干货]这一百多道 Java 基础问题你掌握了吗?

    码农每日一题长按关注,工作日分享一些技术知识点. [每日一题]Java 基本数据类型基础面试题 [每日一题]Java 包装类型装箱拆箱基础面试题 [每日一题]Java 字符串(Part 1)相关面试题 ...

  7. NIO 之 FileChannel

    概述 文件通道总是阻塞式的,因此不能被置于非阻塞模式.现代操作系统都有复杂的缓存和预取机制,使得本地磁盘 I/O 操作延迟很少.网络文件系统一般而言延迟会多些,不过却也因该优化而受益. 面向流的 I/ ...

  8. 微信机、网络和java的相关知识点

    TCP/IP体系和OSI参考模型 TCP/IP体系的网际层及其协议 网际协议(IP) Internet控制报文协议 地址解析协议 反向地址解析协议(RARP) 动态主机配置协议 TCP/IP体系的传输 ...

  9. dcase_util教程(二)——各单元介绍

    接着上一篇教程,继续的有各个UTILITIES的介绍.网址 1. Container 数据容器的类.这些数据的目的是为了包装数据,使用有用的方法来访问和操作数据,以及加载和存储数据. 这些容器是从标准 ...

最新文章

  1. Enhancement spot 增强点简介
  2. 同一域名下部署多个vue项目
  3. Nginx高并发系统内核优化
  4. 免费申请 Office365 E5 开发者订阅
  5. python算法实验是什么_PCA 算法实验代码(python)
  6. 2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,比较有研究潜力?
  7. 【事件驱动】【数码管识别】一(数码管检测(矩形检测函数解读))
  8. 拓端tecdat|matlab使用移动平均滤波器、重采样和Hampel过滤器进行信号平滑处理
  9. linux下编译运行驱动
  10. CocosCreator编辑器界面
  11. 车辆管理系统 c++
  12. Vue入门之vue框架简介库和框架的区别MVVM介绍安装vuevue所管理的边界双向数据绑定vue事件vue的生命周期
  13. 二叉树多种遍历的时间复杂度和空间复杂度
  14. 计算机网络技术在实践中应用,计算机网络技术及在实践中的具体应用
  15. 使用CXF+Spring发布WebService,启动报错
  16. 常见的HTPP状态码
  17. 基于域名的虚拟主机配置
  18. 丁香园php岗_丁香园面试药学新闻编辑岗位体悟
  19. Windows蓝屏代码含义速查
  20. 对一些内存名词术语的解释(bank ECC等)——转载

热门文章

  1. 近几年天猫双十一交易额数据是多少
  2. 表格无法无法计算机,无法打开Excel表的几种原因的解决方案
  3. 三国志战略版:血刃系列_马超蜀骑枪
  4. Android - 仿iPhone调节音量/亮度
  5. 简单盘点下22年第一季度一直坚持的五件小事
  6. bobo老师玩转算法面试,如何准备技术面试?
  7. 各种编程资源,持续更新
  8. 福耀玻璃:硬刚美国这种事,17年前有一个人做过
  9. git密钥.pub文件转换为.ppk文件并TortoiseGit配置.ppk
  10. STM32F103ZET6+USART+串口通信