`
hanhan8020
  • 浏览: 45658 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论
阅读更多

文件锁

JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制。

注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 。如果在同一虚拟机两次锁定同一文件或某文件里的同一区域,tryLock与lock则会抛出OverlappingFileLockException异常。

要想获取整个文件的锁,可以用FileChannel的tryLock( )或lock( )方法。(SocketChannel,DatagramChannel,以及 ServerSocketChannel是不需要锁的,因为它们是从单进程实体继承而来;一般来说,你是不会让两个进程去共享一个网络socket的。tryLock( ) 是非阻塞的,它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回;而lock( )是阻塞的,如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它的线程,或者关闭了它要lock()的channel,否则它是不会返回的。最后用FileLock.release( )释放锁。
还可以像这样锁住文件的某一部分
tryLock(long position, long size, boolean shared) 
或者
lock(long position, long size, boolean shared) 
这个方法能锁住文件的某个区域(size - position)。其中第三个参数表示是否是共享锁。

虽然在修改文件的过程中,无参数的lock( )和tryLock( )方法的锁定范围会随文件大小的变化,带参数的方法却不行。如果你锁住了position到position+size这段范围,而文件的长度又增加了,那么position+size后面是不加锁的。而无参数的lock方法则会锁定整个文件,不管它变不变长。

锁是独占的还是共享的,这要由操作系统来决定。如果操作系统不支持共享锁,而程序又申请了一个共享锁,那么它会返回一个独占锁。你可以用FileLock.isShared( )来查询锁的类型(共享还是独占)。

在写文件时才能锁定,如果对一个只读文件通道进行锁定操作时,会抛NonWritableChannelException异常,即new FileInputStream("data2.txt").getChannel().tryLock();时就会抛异常。

另外锁定写文件通道new FileOutputStream("data2.txt").getChannel().tryLock();时,它会清掉原文件中的内容,所以当文件中有内容时最好使用 new FileOutputStream("data2.txt",true).getChannel().tryLock(); 以追加方式打开写文件通道。或者使用RandomAccessFile类来创建文件通道然后锁定 new RandomAccessFile("data2.txt","rw").getChannel().tryLock(); ,这样它不会破坏锁定的文件的内容。

最后在使用tryLock()获取锁时, 有可能获取不到,这时就会为null,我们需能对此做相应处理。以下是简单的销实例:

Java代码 
  1. import java.io.FileOutputStream;  
  2. import java.nio.channels.FileLock;  
  3.   
  4. public class FileLocking {  
  5.     public static void main(String[] args) throws Exception {  
  6.         FileOutputStream fos = new FileOutputStream("file.txt");  
  7.         //获取文件锁 FileLock 对象  
  8.         FileLock fl = fos.getChannel().tryLock();  
  9.         //tryLock是尝试获取锁,有可能为空,所以要判断  
  10.         if (fl != null) {  
  11.             System.out.println("Locked File");  
  12.             Thread.sleep(100);  
  13.             fl.release();//释放锁  
  14.             System.out.println("Released Lock");  
  15.         }  
  16.         fos.close();  
  17.     }  
  18. }  

分享到:
评论

相关推荐

    Python库 | filelock-3.0.3.tar.gz

    **Python库filelock详解** `filelock`是一个Python库,专为处理文件锁定而设计,特别是在多线程或分布式环境中确保文件操作的互斥性。这个库在版本3.0.3中的功能和特性使得它成为开发人员在处理并发访问文件时的一...

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

    这个压缩包“使用FileLock实现进程的互斥.rar”可能包含了一些示例代码,帮助开发者理解如何在Java中使用`FileLock`来防止并发冲突。 `FileLock`是Java `java.nio.channels.FileChannel`类的一个方法,它提供了锁定...

    08-filelock.rar

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

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

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

    CnCrypt文件保护工具1.1版CnCrypt FileLock.rar

    CnCrypt FileLock添加文件或目录后,创建自定义保护规则。能够提供隐藏、锁定、隐藏并锁定三种保护模式,可添加例外进程。保护你的文件、文件夹不被别人轻易打开、阅读、修改、删除、移动、复制,甚至你可以设置让...

    filelock强大的文件删除工具

    强大的文件删除工具,当你删除文件时,可能遇到文件无法删除,这时候,filelock就可以轻松帮助你解决文件。

    FileLock进程互斥

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

    PyPI 官网下载 | types_filelock-0.1.3-py2.py3-none-any.whl

    资源来自pypi官网。 资源全名:types_filelock-0.1.3-py2.py3-none-any.whl

    filelock绿色文件加密软件

    我昨天刚开始用的加密软件,可以一次加密多个文件。如果想加密文件夹的话可以先将其打包。用过后感觉不错的。软件不需安装,但需要点击“绿化”。安装时请查看解压目录上的说明。加密器的初始密码是123456,绿化后请...

    filelock‑3.0.12‑py2‑none‑any.whl

    离线安装包,亲测可用

    filelock-3.15.4-py3-none-any.whl

    filelock-3.15.4-py3-none-any

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

    install.packages( " filelock " ) 用法 library( filelock ) 这是R进程1,它获得了排它锁。 如果要锁定文件myfile ,请始终创建一个单独的锁定文件,而不是将锁定直接放在此文件上! R1 > lck <- lock( " /...

    java文件锁的实现

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

    文件加密 源码 file lock

    - `FileLock`类:主要的加密/解密逻辑,可能包含`encrypt()`和`decrypt()`方法。 - `KeyManager`类:负责密钥的生成、存储和检索。 - `UI`模块:用户界面相关的代码,包括文件选择对话框和输入密码的界面。 - `...

    filelock-3.16.1-py3-none-any.whl

    # 官方离线 whl 包 # 离线安装 whl 指令,/data/pkg/whls 为本地 whl 文件路径 pip install --no-index --find-links=/data/pkg/whls *.whl

    flock:Go中的线程安全文件锁定库(最初为github.comtheckmango-flock)

    群 flock实现了线程安全的sync.Locker接口,用于文件锁定。 它还包括一个非阻塞的Try...安装go get -u github.com/gofrs/flock用法import "github.com/gofrs/flock"fileLock := flock . New ( "/var/lock/go-lock.lock

    PyPI 官网下载 | python-locker-1.0.2.tar.gz

    1. **FileLock**: 这是一种基于文件系统的锁,适用于跨进程的同步。它通过创建临时文件来表示锁的状态,确保不同进程间对资源的互斥访问。 2. **ThreadLock**: 这是基于Python线程的锁,主要用于单个进程内的线程...

    给文件加锁

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

    Python库 | flufl.lock-2.1.1.tar.gz

    `FileLock`是基于文件系统的锁,可以在跨进程的情况下工作,因为多个进程可以共享同一文件系统。它通过创建和删除特定的文件来实现锁机制,这样即使在进程之间,也可以协调对资源的访问。而`Semaphore`则是一种信号...

    EXELOCK 1.83 EXE文件加密器的源代码-.zip

    2. FileLock.btl、PassDialog.btl:这些可能是使用某种特定的编程库或框架(如Borland Delphi)的组件定义文件,用于描述用户界面元素和它们的行为。 3. FileLock.cfg、PassDialog.cfg:配置文件,通常用于存储应用...

Global site tag (gtag.js) - Google Analytics