`
qianshangding
  • 浏览: 129132 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

文件锁-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;
  }

分享到:
评论

相关推荐

    08-filelock.rar

    在这个场景中,"08-filelock.rar"是一个压缩包,包含了与Linux和UNIX系统编程相关的源码副本,很可能是关于文件锁实现的示例代码或库。 在Linux和UNIX系统中,文件锁主要分为两种类型:记录锁(Record Locks)和...

    Python库 | filelock-3.0.3.tar.gz

    总的来说,`filelock-3.0.3.tar.gz`这个资源包含了`filelock`库的源代码,供开发者在自己的项目中集成并利用其强大的文件锁定功能。无论是在后端服务还是在Python开发的任何部分,`filelock`都是一个非常实用的工具...

    Python库 | types_filelock-0.1.3-py2.py3-none-any.whl

    Python库`types_filelock-0.1.3-py2.py3-none-any.whl`是针对Python编程语言的一个特定版本的软件包,主要用于文件锁定功能。在这个库中,`filelock`是核心组件,它提供了跨平台的文件锁定机制,确保在多线程或...

    java文件锁的实现

    Java提供了多种方法来实现文件锁,主要通过`java.nio.channels.FileLock`类来实现。以下是一些关键概念和步骤: 1. **使用FileChannel**:文件锁是与`FileChannel`紧密相关的。`FileChannel`可以从`FileInputStream...

    java 文件锁的简单实现

    在 Java 中,可以使用 FileLock 类来实现文件锁。下面将详细介绍 Java 文件锁的简单实现。 什么是文件锁 文件锁是一种机制,它允许程序控制文件的访问和修改,以确保文件的安全性和一致性。当多个程序同时访问同一...

    使用FileLock实现进程的互斥.rar

    2. **锁定文件**:然后,你可以使用`channel.lock()`或`channel.tryLock()`方法来尝试获取文件锁。`lock()`会阻塞直到获取到锁,而`tryLock()`是非阻塞的,如果没有立即获取到锁,它会返回`null`。锁定可以是独占的...

    给文件加锁

    本篇将深入探讨文件锁的概念、工作原理以及如何在C语言中实现,参考提供的`filelock.c`和`filelock.h`文件。 文件锁分为两种类型:共享锁(读锁)和独占锁(写锁)。共享锁允许多个进程同时读取文件,但不允许写入...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO(New Input/Output)...5. 文件锁:利用FileLock实现文件的同步控制,保证并发环境下的数据安全。 对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。

    FileLock进程互斥

    在Java中,`FileLock`类提供了一种方法来实现对文件的独占式锁定,从而达到进程间的互斥。 `FileLock`是Java NIO(非阻塞I/O)的一部分,它允许程序锁定一个文件或者文件的部分区域,以防止其他进程同时读写该文件...

    filelock:R中的跨平台文件锁定

    文件锁 便携式文件锁定 在文件上放置排他或共享锁。 它在Windows上使用LockFile ,在类似Unix的系统上使用fcntl锁。 安装 照常从CRAN安装软件包: install.packages( " filelock " ) 用法 library( filelock ) 这...

    java网络编程NIO视频教程

    - **主要内容**:解释FileLock(文件锁)的作用及使用方法。 - **学习目标**:掌握文件锁的实现。 #### 29. Java NIO-FileLock-示例代码 - **主要内容**:提供使用FileLock的示例代码。 - **学习目标**:学会如何在...

    PHP 文件锁与进程锁的使用示例

    **文件锁** 文件锁主要通过flock()函数实现,它允许程序在读写文件时获取和释放锁。文件锁通常应用于以下场景: 1. **限制并发访问**:当多个进程或服务器需要同时修改同一文件时,文件锁可以确保一次只有一个进程...

    文件加密 源码 file lock

    文件锁功能通常包括以下组件: 1. 密钥管理:创建、存储和管理用于加密的密钥,确保只有授权用户能访问。 2. 加密/解密引擎:实现加密算法,对文件内容进行处理。 3. 用户接口:提供友好的图形用户界面(GUI),...

    powerbuilder

    PrintDefineFont() 功能定义打印作业使用的字体,对每个打印作业PowerBuilder支持八种字体。 语法PrintDefineFont(printjobnumber,fontnumber,facename,height,weight,fontpitch,fontfamily, italic,underline) ...

    python-lockfile

    开源的文件锁 ,包含有lockfile的源码

    JavaPD-Ch09mao文件及输入输出流1

    文件锁(FileLock)用于在多线程或多进程环境中控制对文件的访问,确保数据的一致性和完整性。 在实际编程中,关闭打开的流是非常重要的,可以防止资源泄漏。通常,使用`try-with-resources`语句可以自动关闭流,...

    计算机软件-商业源码-查看某一文件被谁加锁.zip

    7. **源码分析**:在提供的"查看某一文件被谁加锁"的源码中,可能包含了检测文件状态、获取文件锁信息、解析进程信息等功能。通过分析源码,开发者可以学习到如何在实际项目中实现文件锁定检查和管理,这对于开发多...

    File 线程读写

    - 在Java中,`java.nio.channels.FileLock`接口提供了文件锁的功能,可以实现线程间的互斥访问。在读写文件时,可以使用文件锁来防止多个线程同时写入。 4. **缓冲区(Buffer)与非阻塞IO**: - 使用缓冲区可以...

    NIO学习系列:文件锁定和字符集

    通过调用`FileChannel.lock()`方法,我们可以尝试获取一个文件锁。如果文件已被其他进程或线程锁定,该操作将阻塞直到锁可用。文件锁是共享的,意味着同一文件可以被多个读取者同时锁定,但只能被一个写入者锁定。这...

    2021最新-Java NIO视频教程-视频教程网盘链接提取码下载 .txt

    教程内容涵盖:阻塞和非阻塞IO、Channel通道、Buffer缓冲区、Selector选择器、Pipe管道、FileLock文件锁,以及Path、Files、异步FileChannel和Charset字符编码等,并通过一个多人聊天室的综合案例,把所有的NIO知识...

Global site tag (gtag.js) - Google Analytics