文件锁(Filelock) 与锁定映射文件部分内容

文件锁filelock源码解读 笔者遇到需要在不同的进程中访问同一个文件的场景,但是这个文件是临界资源,不能同时访问,因此需要利用锁机制来控制不同进程之间的访问。于是,引出了进程锁(即文件锁)这个概念。经过查阅资料,笔者发现filelock库可以满足我们的要求。笔者在使用之余也想看看到底是怎么实现的文件锁,于是便对源码(3.2.1版本)做了解析。以上就是今天要讲的内容,本文介绍了filelock中的几个核心类,经过粗略的了解,读者应该对如何使用filelock类有几分心得了。 阅读详情

文件锁(Filelock) 与锁定映射文件部分内容

文件锁

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. }  
import java.io.FileOutputStream;
import java.nio.channels.FileLock;

 

public class FileLocking { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("file.txt"); //获取文件锁 FileLock 对象 FileLock fl = fos.getChannel().tryLock(); //tryLock是尝试获取锁,有可能为空,所以要判断 if (fl != null) { System.out.println("Locked File"); Thread.sleep(100); fl.release();//释放锁 System.out.println("Released Lock"); } fos.close(); } }

锁定映射文件中的部分内容

文件映射通常用于很大的文件,因此我们可能需要对文件操作的部分进行加锁,以便其他进程可以修改文件中未被加锁的部分。

Java代码 
  1. import java.io.IOException;  
  2. import java.io.RandomAccessFile;  
  3. import java.nio.ByteBuffer;  
  4. import java.nio.MappedByteBuffer;  
  5. import java.nio.channels.FileChannel;  
  6. import java.nio.channels.FileLock;  
  7.   
  8. public class LockingMappedFiles {  
  9.     static final int LENGTH = 0x200000; // 2 Mb  
  10.     //static final int LENGTH = 100;  
  11.     static FileChannel fc;  
  12.   
  13.     public static void main(String[] args) throws Exception {  
  14.         //使用可随机访问文件创建可读写文件通道  
  15.         fc = new RandomAccessFile("test.txt", "rw").getChannel();  
  16.         //内存映射可读写文件,并映射至整个文件  
  17.         MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);  
  18.         for (int i = 0; i < LENGTH; i++) {//写满2M内容  
  19.             out.put((byte) 'x');  
  20.         }  
  21.         //锁定前1/3内容  
  22.         new LockAndModify(out, 0, 0 + LENGTH / 3);  
  23.         //从文件中间开始锁定1/4内容,注,要锁定的内容一定不能有与  
  24.         //已经锁定的内容,否则抛OverlappingFileLockException  
  25.         new LockAndModify(out, LENGTH / 2, LENGTH / 2 + LENGTH / 4);  
  26.     }  
  27.   
  28.     private static class LockAndModify extends Thread {  
  29.         private ByteBuffer buff;  
  30.         private int start, end;  
  31.   
  32.         LockAndModify(ByteBuffer mbb, int start, int end) {  
  33.             this.start = start;  
  34.             this.end = end;  
  35.   
  36.             //调整可最大读写位置  
  37.             mbb.limit(end);  
  38.             //调整读写起始位置  
  39.             mbb.position(start);  
  40.             //创建新的子缓冲区,但与原缓冲是共享同一片数据,  
  41.             //只是缓冲区位置、界限和标记值是相互独立的  
  42.             buff = mbb.slice();  
  43.             start();  
  44.         }  
  45.   
  46.         public void run() {  
  47.             try {  
  48.                 // 获取独占锁,如果要锁定的部分被其他应用程序锁定,则会阻塞,至到获取锁为止  
  49.                 FileLock fl = fc.lock(start, end, false);  
  50.                 System.out.println("Locked: " + start + " to " + end);  
  51.                 System.out.println(buff.position() + "  " + buff.limit());  
  52.   
  53.                 // 进行修改操作,前当前位置类  
  54.                 while (buff.position() < buff.limit() - 1) {  
  55.                     buff.put((byte) (buff.get() + 1));  
  56.                 }  
  57.                 //JVM退出,或者channel关闭的时候会自动释放这些锁,但是你也可以用FileLock  
  58.                 //的release( )方法,明确地释放锁,就像这里释放锁一样  
  59.                 fl.release();  
  60.                 System.out.println("Released: " + start + " to " + end);  
  61.             } catch (IOException e) {  
  62.                 throw new RuntimeException(e);  
  63.             }  
  64.         }  
  65.     }  
  66. } 



C语言入门—初识C语言 一、C语言概述 1、什么是C语言 语言是用来交流沟通的,有一方说,有一方听。必须要两方参与。(自言自语的除外) 语言是人与人交流,而C语言是人与机器交流 语言有独特的语法规则和定义,双方必须遵循这些规则和定义才能实现真正的交流。 接下来首先了解下计算机的组成: 2、计算机介绍 2.1、计算机结构组成 2.2、计算机系统组成 2.3、程序的指令 指令是对计算机进行程序控制的最小单元 计算机的指令系统是指所有指令的集合 程序是指为完成某一项特定任务而用某种言语编写的一组指令序列 3、C语言发展历程 3. 阅读详情

相关推荐

SpringBoot多线程查询实战-查询库中所有数据多线程实现

但是,在数据量较大且服务器资源足够的情况下,多线程方法通常能够显著提高查询效率。此外,由于它是同步执行的,没有利用并行处理的能力,所以在处理大量数据时可能会比较慢。这个方法采用了分页查询的方式,每次只获取一部分数据,从而避免了内存溢出的问题。然而,它也是同步执行的,没有利用多线程或并行处理的能力。如果每次分页查询的数据量仍然很大,或者需要查询的轮数很多,那么这种方法的效率可能仍然会受到限制。​ ​ ​在比较这三种方式的效率时,我们需要考虑几个关键因素:数据量的大小、查询操作的复杂性、以及并行处理的能力。

勇敢牛牛,不怕困难! 4809

FileLock——Java文件锁

使用FileLock可以给文件加锁,在多线程和多进程的情况下均有效。(File类的setReadable()等方法只在当前线程中有效。) 代码场景为写进程先获取锁,向文件中写入一串数字后释放锁。读进程等待写进程释放锁后获取锁并输出文件大小。 写进程代码: import java.io.RandomAccessFile; import java.nio.channels.FileChann

_Sonia_的专栏 1万+

maya中的几个热盒(空格、shift、w键)

maya中许多功能打包放进了不同的热盒中,让我们使用起来更加的便捷,熟练掌握后可以大大提升了建模速度。按下不同按键后鼠标不需要精确点到某个图标,往某个方向滑滑滑就打开了相应功能,非常的炫酷和迅猛。

m0_71983242的博客 1756

文件锁FileLock

1.文件锁的定义   FileLock是文件锁,进程锁,用于进程间并发,控制不同程序(JVM)对同一文件的并发访问。   FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问;而其它拿不到锁的进程要么选择被挂起等待,要么选择去做一些其它的事情,这样的机制保证了众进程可以顺序访问该文件。 ...

weixin_33884611的博客 565

零基础微信理财通基金实操指南(2026版)

先活下来:保证不亏大钱,再想赚钱慢慢变富:年化10%,7年翻倍,这已经很好了开始比完美重要:今天先存100元到零钱通,就是最好的开始现在打开微信,进入理财通,完成第一步风险测评吧!有任何问题可以随时问,我会用最通俗的方式解释。

老韩的Linux云计算架构师进阶之路 1685

股票行情接口,最全的接入方法

股票行情接口一般有两种,一种是WebSocket,一种是http,通过WebSocket可以获取逐笔的股票tick数据,实时并且高效;通过http接口可以获取股票行情接口中的股票历史数据;WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。其次,WebSocket允许您订阅特定的数据源或股票数据产品,只接收您感兴趣的信息,提高了数据的效率和可用性。通过接入股票行情数据的HTTP接口,您可以将数据导入到自己的分析工具或系统中,进行更深入的数据分析、模型构建和决策支持。

apifinance的博客 3423

FileLock 基于进程的并发文件锁

FileLock,文件锁 FileLock 是基于进程级别的,不是针对于线程级别的,因此文件锁对象可以安全地被多个并发线程使用。 文件锁分为2类: 1. 独占锁(排它锁) 进程对文件加独占锁后,当前进程对文件可读可写,独占此文件,其它进程是不能读该文件进行读写操作的,直至该进程释放文件锁release()。独占锁可防止其他程序获取任一类型的重叠锁。 一旦释放,锁对其他程序可能获得的锁不起任何影响。 2. 共享锁 进程多文件加共享锁后,其它进程也可以对文件进行...

u013620698的博客 905

【Labview】对连续采集数据的一种采样方法

图1如图1,想要对这样一个连续信号进行数据点的采集,我根据网上收集到的方法,在此分享一下最终的结果。可以拓展结合文件的写入,完成对连续信号的采集和输出。 已知: 一个连续信号,如图1. 目标: 设定一定采集点个数、采集点时间间隔、和采集周期次数,得到这条连续信号的数据点,如图2. 图2 方法如下: 主要利用的是队列的方法。 在连续信号生成的时候,不断的写入队列,并且清除队列。 ...

李时珍食疗志的博客 1万+

filelock,一个超酷的 Python 库!

Python filelock库是一个强大的工具,用于在多线程或多进程环境中管理文件的并发访问。它提供了简单而灵活的方式来控制文件的读写操作,避免了数据竞争和冲突,提高了程序的稳定性和可靠性。通过文件锁,我们可以精确地控制对共享文件的访问,确保数据的安全性和一致性。无论是在数据库连接池、日志系统、缓存管理还是其他实际应用场景中,Python filelock库都展现了出色的功能和效果。总之,Python filelock库为开发者提供了一个可靠的工具,用于处理并发文件访问,是开发中不可或缺的一部分。

u011735907的专栏 1671

【Burp入门第三十七篇】AutoRepeater插件安装使用教程+越权实战案例

AutoRepeater 通过接收满足特定条件的请求,按照预设的基础替换规则对请求进行处理。在接收到匹配请求后,它首先应用基础替换,然后针对每个定义的替换创建请求副本并应用该替换操作,从而实现对不同参数的修改和请求的重复发送,以此来全面检测 Web 应用的授权情况。1、自动化请求重复:能自动复制、修改并重发 HTTP 请求,避免了手动重复操作的繁琐,大大提高了 Web 应用授权测试的效率。2、灵活参数替换:可灵活改变邮箱地址、账号身份、角色、URL 和 CSRF 令牌等关键参数。

等风来 2035

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1825

文件锁(Filelock)与锁定映射文件部分内容

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

a925907195的专栏 1744

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2852

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java 映射文件加锁_FileChannel和文件锁

FileChannelFileChannel 可以通过 RandomAccessFile 获取,或者FileChannel.open,亦或 IS/OS 获取。write 和 read 都是通过 ByteBuffer 来存储。FileChannel.open时可以提供 OpenOption 来定义行为,如果需要写的话可以使用 write 和 append 模式,在不确定文件是否存在是加入 Crea...

weixin_35719402的博客 352

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NIO-FileChannel详解

一.FileLock(通道文件锁,记录区域锁):表示文件区域锁定标记.FileLock并没有实现lock接口,它仅仅是一个辅助锁操作类.每次通过FileChannel.lock()或者tryLock()获取文件锁.一旦获取锁,那么lock将持续有效,直到被release(),以及JVM退出.可以通过对fileLock.isValid()检测锁的有效性.文件锁要么是独占的,有么是共享的.共享锁可...

深入一点 514

java nio 添加锁_java nio - 2 文件加锁

文件锁 FileLockJdk 1.4 引入文件加锁机制,它允许我们同步访问某个作为共享资源的文件。不过,竞争同一个文件的两个线程可能在不同的JVM上;或者一个未java线程,另一个为操作系统中其他的每个本地线程。文件锁对其它的操作系统进程是可见的因为java的文件锁是直接映射到了本地操作系统的加锁工具。这里写图片描述tryLcok和locktryLock()是非阻塞式的,它设法获取锁,但是如果不...

weixin_42639633的博客 191

JAVAIO-文件加锁

JAVAIO-文件加锁

qq_40432598的博客 454

java nio - 2 文件加锁

文件锁 FileLock Jdk 1.4 引入文件加锁机制,它允许我们同步访问某个作为共享资源的文件。不过,竞争同一个文件的两个线程可能在不同的JVM上;或者一个未java线程,另一个为操作系统中其他的每个本地线程。文件锁对其它的操作系统进程是可见的因为java的文件锁是直接映射到了本地操作系统的加锁工具。 tryLcok和lock tryLock()是非阻塞式的,它设法获取锁,但是

Duan的博客 611

java nio 内存映射文件

内存映射文件 一、内存映射文件    内存映射文件的优势是比其他操作文件的方法访问文件的速度要快。 方法: 1)获得一个通道 FileChannel channel = FileChannel.open(path,options);    还能通过在一个打开的 File 对象(RandomAccessFile、FileInputStream 或 FileOutputStream)上

小白 804

文件锁-FileLock

最近在看flume部分功能的源码,关于FileLock的使用,其实在很多开源框架都有涉及,我所看过的有lucene,zookeeper,hadoop,es等开源框架都有用到,下面简单的介绍下FileLock。 1,FileLock是独占锁,控制不同程序(JVM)对同一文件的并发访问。2,可以对写文件(w)加锁,而且必须是可写文件,不然回报:java.nio.channels.NonWrit...

iteye_14970的博客 645
上一篇: LayoutInflater 的使用 ----动态改变布局;
下一篇: android 地图服务开发 INSTALL_FAILED_MISSING_SHARED_LIBRARY 错误解决
慕广陵
博客等级 码龄17年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值