文件锁-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();// 删除没效果,必须使用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;
  }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 14:23:42

文件锁-FileLock的相关文章

[转载] 文件锁(Filelock)与锁定映射文件部分内容

转载自http://jiangzhengjun.iteye.com/blog/517677 文件锁 JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制.注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 .如果在同一虚拟机两次锁定同

文件锁FileLock

FileLock是文件锁,进程锁,用于进程间并发,控制不同程序(JVM)对同一文件的并发访问. FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问:而其它拿不到锁的进程要么选择被挂起等待,要么选择去做一些其它的事情,这样的机制保证了众进程可以顺序访问该文件. 可以看出,能够利用文件锁的这种性质,在一些场景下,虽然我们不需要操作某个文件,但也可以通过 FileLock 来进行并发控制,保证进

java核心学习(十九) javaNIO框架---文件锁

在上一节提到的FileChannel中提供了lock()/tryLock()方法可以获得文件锁FileLock对象,从而锁定文件,这里的文件锁是进程级别的锁,而非线程锁. lock()方法是阻塞试的,当调用该方法且无法得到文件锁,程序将一直阻塞. tryLock()方法是非阻塞式的加锁方法,如果获得了文件锁,则该方法返回该文件锁,否则将返回null. 文件锁分为共享锁和排他锁,当lock/tryLock方法的第三个参数为true时表明该锁是共享锁,共享锁允许多个进城来读取该文件,但阻止其他进程获

Java复习--IO(输入/输出){Java NIO}

http://my.oschina.net/u/2263278/blog/508770中介绍的BufferedReader时提到它的一个特征----当BufferedReader读取输入流中的数据时,如果没有读到有效数据,程序将在此处阻塞该线程的执行(使用InputStream的read()方法从流中读取数据时,如果数据源中没有数据,它也会阻塞该线程),也就是前面介绍的输入流.输出流都是阻塞式的输入.输出.传统的输入流.输出流都是通过字节的移动来处理的,即使我们不直接去处理字节流,但底层的实现还

Java复习之新IO

一.缓冲区与Buffer 1. 缓冲区的作用 java.nio.ByteBuffer java.nio.CharBuffer java.nio.ShortBuffer java.nio.IntBuffer java.nio.LongBuffer java.nio.FloatBuffer java.nio.DoubleBuffer position,limit,capacity 2. 缓冲区的操作原理 二.通道(Channel) 1. 通道的作用 2. 通道完成读.写的双向操作 FileChann

curlini project的感悟

闲来无事,在github上发现一个很有趣的project curlini,实现命令行对ini文件的增删改查和merge操作.起初会觉得至于如此小题大做么,但查阅之后,发现该项目对文件的操作比较精细,从文件锁FileLock.临时文件tempfile.SHA256 hashlib.退出执行atexit.shutil文件操作都使人眼前一亮. contextlib上下文管理器 使用装饰器 contextlib.contextmanager() 将一个生成器函数转换为上下文管理器,在yield前,为前置

Linux互斥与同步应用(六):文件锁

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途] 当一个系统中存在多个进程同时操作同一个文件时,为了保证数据的正确, 一般会将文件上锁来避免共享文件产生的竞争状态.在linux系统下文件上锁可以使用fcntl函数来实现. 函数fcntl原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, .

文件锁

RandomAccessFile可以设置文件锁 RandomAccessFile input=new RandomAccessFile("test.txt","rw")//得到一个随机流 FileChannel channel1=input.getChannel()//得到文件通道 FileLock lock=channel1.tryLock()//锁 lock.release()//释放锁

【Java NIO基础3】文件锁

1.1概述--文件锁 文件锁定初看起来可能让人迷惑.它 似乎 指的是防止程序或者用户访问特定文件.事实上,文件锁就像常规的 Java 对象锁 - 它们是 劝告式的(advisory) 锁.它们不阻止任何形式的数据访问,相反,它们通过锁的共享和获取赖允许系统的不同部分相互协调. 您可以锁定整个文件或者文件的一部分.如果您获取一个排它锁,那么其他人就不能获得同一个文件或者文件的一部分上的锁.如果您获得一个共享锁,那么其他人可以获得同一个文件或者文件一部分上的共享锁,但是不能获得排它锁.文件锁定并不总