锁——FileLock 文件锁
文件锁(FileLock),使用文件锁锁住文件后,其他进程不能操作读或写文件,除非当前进程release或unlock文件锁。
前两天看码云上的oim项目源码,该项目即使用了文件锁来防止同一账户重复登录(当然,该方法是不太合理的,因为用户换一台电脑或修改锁文件路径即可同一账户重复登录,但也是一个文件锁使用的不错的例子)
文件锁分为共享锁、独占锁,加锁方式有阻塞(lock())和非阻塞(tryLock())。
tryLock或lock时使用参数如fileChannel.tryLock(0L, Long.MAX_VALUE, true),即可使用共享锁
以下实例代码为独占锁实例,先运行FileLockTest 再运行BlockLock
FileLockTest .java
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package file.lock;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;/**** @author Administrator*/
public class FileLockTest {/*** @param args the command line arguments*/public static void main(String[] args) throws FileNotFoundException,IOException{File file;FileChannel fileChannel;RandomAccessFile randomAccessFile;String path = "C:\\Users\\Administrator\\Desktop\\lock\\my.lock";file = new File(path);if(!file.exists()){file.createNewFile();}randomAccessFile = new RandomAccessFile(file, "rw");//通过RandomAccessFile获取FileChannelfileChannel = randomAccessFile.getChannel();/****** tryLock非阻塞,抢不到锁立即返回null* lock阻塞锁,抢不到锁一直等待*///通过FileChannel进行tryLock()final FileLock fileLock = fileChannel.tryLock();if(null == fileLock){System.out.println("老大,属下无能,文件已经被其他进程锁住!");}else{if(fileLock.isValid()){System.out.println("老大,本进程已经先行一步锁住了文件了!");new Thread(new Runnable() {@Overridepublic void run() {try {//当前文件应该处于被锁住状态,20后解锁,阻塞锁lock会立即获取锁Thread.sleep(20 * 1000);randomAccessFile.read();System.out.println("我读完了,我要释放锁!");fileLock.release();} catch (Exception ex) {ex.printStackTrace();}}}).start();}}exit();}private static void exit(){while (true) { try {Thread.sleep(10 * 10000);} catch (InterruptedException ex) {ex.printStackTrace();}}}
}
BlockLock.java
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package file.lock;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;/**** @author Administrator*/
public class BlockLock {public static void main(String[] args) throws FileNotFoundException, IOException {File file;FileChannel fileChannel;RandomAccessFile randomAccessFile;String path = "C:\\Users\\Administrator\\Desktop\\lock\\my.lock";file = new File(path);if(!file.exists()){file.createNewFile();}randomAccessFile = new RandomAccessFile(file, "rw");//通过RandomAccessFile获取FileChannelfileChannel = randomAccessFile.getChannel();FileLock tempLock = fileChannel.tryLock();if(null == tempLock){System.out.println("我拿不到文件锁,交给阻塞锁lock()拿吧!");System.out.println("开始测试阻塞锁...");FileLock fileLock2 = fileChannel.lock();if(null == fileLock2){}else{if(fileLock2.isValid()){System.out.println("老大,那小子一释放锁,就被我抢到了!厉害不!");}}}else{System.out.println("使用非阻塞锁拿到了文件锁...");}}
}
运行结果如下:
FileLockTest:
老大,本进程已经先行一步锁住了文件了!
我读完了,我要释放锁!
BlockLock:
我拿不到文件锁,交给阻塞锁lock()拿吧!
开始测试阻塞锁...
老大,那小子一释放锁,就被我抢到了!厉害不!
如有错误,欢迎指正
end
锁——FileLock 文件锁相关推荐
- python filelock 文件锁_详解进程文件锁FileLock
import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; i ...
- 【死磕NIO】— 跨进程文件锁:FileLock
大家好,我是大明哥,一个专注于[死磕 Java]系列创作的程序员. [死磕 Java ]系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码 死磕 ...
- 【转载保存】索引文件锁LockFactory
索引文件锁LockFactory LockFactory在Lucene中用来对索引文件所在的目录进行加锁,使得同一时间总是只有一个IndexWriter对象可以更改索引文件,即保证单进程内(sin ...
- 什么是锁PHP,PHP简单分布式锁-PHP中的锁
对于PHP的锁,其实并没有什么太多的概念.抛弃一些第三方的依赖,看看有哪些可用的选择. 文件锁 PHP的sync扩展 PHP的opcache中的apc_add 目前可以想到的就这么多,在该项目中我们采 ...
- gunicorn + Flask架构中使用多进程全局锁
有之前的认识WSGI和WSGI的前世今世之后,现在就可以介绍如何在gunicorn + Flask架构模式下,在Flask处理线程中使用全局锁. 说到锁在Python中也有很多锁,最常见用的就是多进程 ...
- 并发下常见的加锁及锁的PHP具体实现-转载
php并发编程-转自:http://www.cnblogs.com/jingzhishen/p/4328740.html 并发下常见的加锁及锁的PHP具体实现 http://www.cnblogs.c ...
- Perl IO:文件锁
文件锁 当多个进程或多个程序都想要修同一个文件的时候,如果不加控制,多进程或多程序将可能导致文件更新的丢失. 例如进程1和进程2都要写入数据到a.txt中,进程1获取到了文件句柄,进程2也获取到了文件 ...
- 文件锁操作《精通Unix下C语言编程与项目实践》之三
文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功 我的诗歌:都是我的打 ...
- 文件锁(一)——文件锁的概述
文件锁的概述 文件锁也被称为记录锁,文件锁如果深耕的话,意义不大(比如文件锁起码分为了建议锁和强制性锁). 但是深入没有意义的,因为实际开发很少用上,文件锁用到的机会不多,那为什么要学? 主要是为了对 ...
最新文章
- Java:log4j:WARN no appenders could be found for logger问题解决
- 关于手机的,发送验证码,正则
- Fedora 11-Alpha试用手记
- burpsuite插件的使用
- 他开发了redux,昨晚字节一面却挂了?
- Maven学习总结(23)——Maven常用命令介绍
- 用 CSS 实现元素垂直居中
- PCB画板子常用快捷键总结
- 小程序开发:python sanic 实现小程序登录注册
- python open 函数漏洞_input()函数中的Python漏洞
- 图数据库Neo4j下载、安装
- 可自主二次开发的微信云控客服crm系统软件(带源码)
- wps计算机里wps云盘图标,我的电脑中的wps网盘图标怎么设置删除
- Intellij IDEA2017.3.5利用补丁破解
- Unity一般工程升级到HDRP
- RoboMaster机甲大师——视觉组——摄像头的选型与应用
- TCP Data Flow and Window Management(1)
- 嵌入式linux数控系统,关于ARM+DSP嵌入式Linux数控系统设计.pdf
- 华为表哥手把手教你利用Jenkins持续集成iOS项目,教不会我花式拉翔!!!
- 计算机专业硕士学制,计算机研究生学制
热门文章
- mysql更改数据库登录密码失败;Access denied for user 'root'@'localhost;mysqladmin: connect to server at 'localhos
- 进程控制 父进程子进程 fork pid
- Win7下eclipse提交Job到hadoop集群
- 如何处理电脑长时间未操作出现的假死?
- 存储服务器在监控中的作用,监控项目中存储服务器IPSAN云存储方案的优劣势对比...
- font:12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif详解
- 14年间,用友U9 cloud如何让众多“专精特新”成长为行业冠军
- 待忧伤开满山岗,等青春散场
- 关于嵌入式EMW3162 Wifi模块的网络配置与测试
- 注册页面案例-世纪佳缘