最近在看flume部分功能的源码,关于FileLock的使用,其实在很多开源框架都有涉及,我所看过的有lucene,zookeeper,hadoop,es等开源框架都有用到,下面简单的介绍下FileLock。
1,FileLock是独占锁,控制不同程序(JVM)对同一文件的并发访问。
2,可以对写文件(w)加锁,而且必须是可写文件,不然回报:java.nio.channels.NonWritableChannelException异常,这样可以保证只有同一个进程才能拿到锁对文件访问。其他进程无法访问改文件,或者删除该文件的目录。
3,由于是独占锁,所以
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();// 删除没效果,必须使用deleteOnExit
file.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;
}
分享到:
相关推荐
Linux&UNIX;系统编程手册源码副本
python库。 资源全名:filelock-3.0.3.tar.gz
资源来自pypi官网。 资源全名:types_filelock-0.1.3-py2.py3-none-any.whl
python库,解压后可用。 资源全名:types_filelock-0.1.3-py2.py3-none-any.whl
强大的文件删除工具,当你删除文件时,可能遇到文件无法删除,这时候,filelock就可以轻松帮助你解决文件。
我昨天刚开始用的加密软件,可以一次加密多个文件。如果想加密文件夹的话可以先将其打包。用过后感觉不错的。软件不需安装,但需要点击“绿化”。安装时请查看解压目录上的说明。加密器的初始密码是123456,绿化后请...
CnCrypt FileLock添加文件或目录后,创建自定义保护规则。能够提供隐藏、锁定、隐藏并锁定三种保护模式,可添加例外进程。保护你的文件、文件夹不被别人轻易打开、阅读、修改、删除、移动、复制,甚至你可以设置让...
NULL 博文链接:https://sosuny.iteye.com/blog/704587
文件锁 便携式文件锁定 在文件上放置排他或共享锁。 它在Windows上使用LockFile ,在类似Unix的系统上使用fcntl锁。 安装 照常从CRAN安装软件包: install.packages( " filelock " ) 用法 library( filelock ) 这...
使用FileLock实现进程的互斥.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
使用FileLock实现进程的互斥对应的说明在这里http://blog.csdn.net/codehxy/article/details/50274709
离线安装包,亲测可用
PrintDefineFont() 功能定义打印作业使用的字体,对每个打印作业PowerBuilder支持八种字体。 语法PrintDefineFont(printjobnumber,fontnumber,facename,height,weight,fontpitch,fontfamily, italic,underline) ...
先决条件树莓派上带有buydisplay.com 2.6英寸黑/红屏。黑/黄屏也可以工作。 包装方式: sudo apt install git virtualenv python3-dev libjpeg-dev ttf-bitstream-vera wiringpi python3-filelock python3-pil
开源的文件锁 ,包含有lockfile的源码
教程内容涵盖:阻塞和非阻塞IO、Channel通道、Buffer缓冲区、Selector选择器、Pipe管道、FileLock文件锁,以及Path、Files、异步FileChannel和Charset字符编码等,并通过一个多人聊天室的综合案例,把所有的NIO知识...
文件锁源码,简单的上锁,解锁,其中多处是项目中特有的文件,可以删除自定义,有多个重载方法可以选择。主要形式都是一样的,就是创建文件,删除文件的工具类。
filelock 3.0.12 Flask 1.0.4 gevent 1.4.0 greenlet 0.4.15 idna 2.8 importlib-metadata 1.1.3 importlib-resources 1.0.2 ipython 6.5.0 ipython-genutils 0.2.0 itsdangerous 1.1.0 jedi 0.16.0 Jinja2 2.10.3 ...
文件加密 源码 file lock 文件加密 源码 file lock
群 flock实现了线程安全的sync.Locker接口,用于文件锁定。 它还包括一个非阻塞的TryLock()函数,以允许锁定而不会阻塞执行。执照flock是根据BSD 3-条款许可发布的。 有关更多详细信息,请参见LICENSE文件。兼容该...