锁——FileLock 文件锁_filelock trylock-程序员宅基地

技术标签: Java  

文件锁(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获取FileChannel
        fileChannel = 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() {
                        @Override
                        public 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获取FileChannel
        fileChannel = 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

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wjw521wjw521/article/details/81201283

智能推荐

keepalive单实例通过脚本绑定外部服务实现主备自动切换_keepalived主备模型,当主节点宕机 vip挂载到备机时调用一个脚本如何实现-程序员宅基地

文章浏览阅读726次。keepalive的算法选择的实际操作_keepalived主备模型,当主节点宕机 vip挂载到备机时调用一个脚本如何实现

使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境_maven struts2+hibernate4-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏11次。使用Maven搭建Struts2+Spring3+Hibernate4的整合开发环境一.新建Maven项目1.新建一个Web Project创建好的项目如下图所示:2.修改默认的JDK右键点击,选择Properties3.创建Maven标准目录    src/main/java     src/main/resources_maven struts2+hibernate4

udp一对多聊天java_用udp方式进行聊天的java实现. (转)-程序员宅基地

文章浏览阅读307次。用udp方式进行聊天的java实现. (转)[@more@]我最近也在研究用实现oicq。这是我的客户端的简单实现。主要是通过udp方式,实现间的对话。其中运用了序列化类的方法。以下是,请多提意见。//发送消息类Message.javaimport java.io.Serializable;public class Message implements Serializable{private S..._java客服一对多对话udp

图解TCPIP-ICMP_icmp不可达消息 图解tcp/ip-程序员宅基地

文章浏览阅读231次。ICMP1.确认IP包是否成功送达目标地址2.通知IP包被废弃的具体原因3.改善网络设置4.类型(0回送应答echo reply;3目标不可达Destination Unreachable;)常见类型:3.Destination Unreachable Message5.ICMP Redirect Message路由器发现发送端主机使用了次优路径发送数据,就会返回ICMP重定向(..._icmp不可达消息 图解tcp/ip

合并两个DBC文件的方法_dbc合并-程序员宅基地

文章浏览阅读4.5k次,点赞3次,收藏9次。合并两个DBC文件的方法工具步骤实例配置库及canconvert的其他使用参考工具首先准备好合并文件的工具1.利用python的pip安装canmatrix库。语句:pip install canmatrix2.安装完成后会在pip.exe的附近找到canconvert.exe利用该脚本即可完成合并。(根据提示用pip安装需要的其他库)接下来跟大家讲讲具体步骤,很简单!步骤直接在命令窗中敲出语句:canconvert --merge=second.dbc source.dbc ta_dbc合并

SSA-LSSVM分类预测 | Matlab 麻雀优化最小二乘支持向量机分类预测-程序员宅基地

文章浏览阅读18次。在机器学习领域,数据分类是一个非常重要的任务,它可以帮助我们将数据分成不同的类别,从而更好地理解和分析数据。支持向量机(Support Vector Machine,SVM)是一种常用的分类算法,它通过构建一个最优的超平面来实现数据分类。然而,传统的SVM算法在处理大规模数据集时存在一些问题,例如计算复杂度高、模型泛化能力不足等。为了解决这些问题,研究人员提出了一种基于麻雀算法优化的最小二乘支持向量机(SSA-LSSVM)。

随便推点

RecycleView+卡片+下拉刷新_cf8833 recycleview-程序员宅基地

文章浏览阅读323次。1.添加依赖 implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.0.0' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"2.主界面package com.example.myapplication3import androi_cf8833 recycleview

CTO说:怎么成为并做好CTO-程序员宅基地

文章浏览阅读7.3k次,点赞2次,收藏14次。CTO 可能是大多数开发者心中的梦想,但这些问题:到底什么样的人适合做 CTO ?CTO 要做哪些事情?CTO 持有公司多少股权合适?恐怕多数开发者都搞不清楚……包括我自己,也是五迷三道!直到我看了下面这本书:这本《CTO说》,汇聚了 30 余位 CTO 导师(360副总裁、知乎CTO、京东商城总架构师等等)的经验,可以让我们习得 CTO 成长的道与术。全书共分六篇:CTO的大格局创业平台CTO的_cto说

三分钟教你读懂支票是什么_支票的原理是什么-程序员宅基地

文章浏览阅读8.6k次。三分钟教你读懂支票是什么支票1、支票的概念及特点支票:出票人签发的,委托办理支票存款业务的银行或其他金融机构在见票时无条件支付确定金额给收款人或持票人的票据。支票必填项:支票字样、确定的金额、出票日期、无条件支付委托、付款人名称、出票人签章。支票选填项:付款地、出票地。支票结算特点:(1)简便,手续_支票的原理是什么

POJ 3686 最小费用最大流(拆点建图)_poj3686-程序员宅基地

文章浏览阅读879次。思路:这题还挺难的。刚开始看错题目意思了,然后建图错了得不出答案,然后看了下别人的题解,原来每个矩阵的点还在拆成n个点才得。然后昨晚看了1个小时多小时没理解,今早过来再看,然后用别人的代码运行了一下我自己想出的样例,然后才慢慢理解。解题分析:《参考博客:http://blog.csdn.net/weiguang_123/article/details/7881799》 假设某个_poj3686

Storm项目:流数据监控5《Zookeepe…_storm数据流监控系统-程序员宅基地

文章浏览阅读460次。博客公告:(1)本博客所有博客文章搬迁至《博客虫》http://www.blogchong.com/(2)文章对应的源码下载链接参考博客虫网站首页的“代码GIT”直通车;(3)更多的相关文章更新,以及代码等,请关注博客虫网站,网站中有技术Q群,以及代码共享链接。 该文档为实实在在的原创文档,转载请注明:http://blog.sina.com.cn/s/blog_8c243ea3010_storm数据流监控系统

Java-System.getProperties()和System.getenv()使用说明_system.getenv() 是实时的吗-程序员宅基地

文章浏览阅读2.5k次。背景总结如果配置属性才能让System.getProperty(String)获取到?Systm.getEnv()和System.getProperties()有何区别呢?参考背景最近在看Zookeeper的源码,在初始化ContainerManager时使用Integer.getInteger(String,int)获取相关属性,而不是读取文件中的配置...._system.getenv() 是实时的吗