文件锁(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 文件锁相关推荐

  1. python filelock 文件锁_详解进程文件锁FileLock

    import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; i ...

  2. 【死磕NIO】— 跨进程文件锁:FileLock

    大家好,我是大明哥,一个专注于[死磕 Java]系列创作的程序员. [死磕 Java ]系列为作者「chenssy」 倾情打造的 Java 系列文章,深入分析 Java 相关技术核心原理及源码 死磕 ...

  3. 【转载保存】索引文件锁LockFactory

    索引文件锁LockFactory   LockFactory在Lucene中用来对索引文件所在的目录进行加锁,使得同一时间总是只有一个IndexWriter对象可以更改索引文件,即保证单进程内(sin ...

  4. 什么是锁PHP,PHP简单分布式锁-PHP中的锁

    对于PHP的锁,其实并没有什么太多的概念.抛弃一些第三方的依赖,看看有哪些可用的选择. 文件锁 PHP的sync扩展 PHP的opcache中的apc_add 目前可以想到的就这么多,在该项目中我们采 ...

  5. gunicorn + Flask架构中使用多进程全局锁

    有之前的认识WSGI和WSGI的前世今世之后,现在就可以介绍如何在gunicorn + Flask架构模式下,在Flask处理线程中使用全局锁. 说到锁在Python中也有很多锁,最常见用的就是多进程 ...

  6. 并发下常见的加锁及锁的PHP具体实现-转载

    php并发编程-转自:http://www.cnblogs.com/jingzhishen/p/4328740.html 并发下常见的加锁及锁的PHP具体实现 http://www.cnblogs.c ...

  7. Perl IO:文件锁

    文件锁 当多个进程或多个程序都想要修同一个文件的时候,如果不加控制,多进程或多程序将可能导致文件更新的丢失. 例如进程1和进程2都要写入数据到a.txt中,进程1获取到了文件句柄,进程2也获取到了文件 ...

  8. 文件锁操作《精通Unix下C语言编程与项目实践》之三

    文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功 我的诗歌:都是我的打 ...

  9. 文件锁(一)——文件锁的概述

    文件锁的概述 文件锁也被称为记录锁,文件锁如果深耕的话,意义不大(比如文件锁起码分为了建议锁和强制性锁). 但是深入没有意义的,因为实际开发很少用上,文件锁用到的机会不多,那为什么要学? 主要是为了对 ...

最新文章

  1. Java:log4j:WARN no appenders could be found for logger问题解决
  2. 关于手机的,发送验证码,正则
  3. Fedora 11-Alpha试用手记
  4. burpsuite插件的使用
  5. 他开发了redux,昨晚字节一面却挂了?
  6. Maven学习总结(23)——Maven常用命令介绍
  7. 用 CSS 实现元素垂直居中
  8. PCB画板子常用快捷键总结
  9. 小程序开发:python sanic 实现小程序登录注册
  10. python open 函数漏洞_input()函数中的Python漏洞
  11. 图数据库Neo4j下载、安装
  12. 可自主二次开发的微信云控客服crm系统软件(带源码)
  13. wps计算机里wps云盘图标,我的电脑中的wps网盘图标怎么设置删除
  14. Intellij IDEA2017.3.5利用补丁破解
  15. Unity一般工程升级到HDRP
  16. RoboMaster机甲大师——视觉组——摄像头的选型与应用
  17. TCP Data Flow and Window Management(1)
  18. 嵌入式linux数控系统,关于ARM+DSP嵌入式Linux数控系统设计.pdf
  19. 华为表哥手把手教你利用Jenkins持续集成iOS项目,教不会我花式拉翔!!!
  20. 计算机专业硕士学制,计算机研究生学制

热门文章

  1. mysql更改数据库登录密码失败;Access denied for user 'root'@'localhost;mysqladmin: connect to server at 'localhos
  2. 进程控制 父进程子进程 fork pid
  3. Win7下eclipse提交Job到hadoop集群
  4. 如何处理电脑长时间未操作出现的假死?
  5. 存储服务器在监控中的作用,监控项目中存储服务器IPSAN云存储方案的优劣势对比...
  6. font:12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif详解
  7. 14年间,用友U9 cloud如何让众多“专精特新”成长为行业冠军
  8. 待忧伤开满山岗,等青春散场
  9. 关于嵌入式EMW3162 Wifi模块的网络配置与测试
  10. 注册页面案例-世纪佳缘