JAVA文件锁之保证仅有一个实例运行
思路
在实际项目开发中,要求一台主机上同时只能运行一个程序示例的情况并不少见,而这样的程序基本都是使用C/C++等语言开发
作为毕业后不久就一直使用JAVA开发的我来讲,最近就遇到了一台主机上同时只能运行一个JAVA实例(Runable JAR)的问题
JAVA不像C/C++等其他编译型语言,程序运行后可以通过进程名来区分是否已经有示例正在运行,JAVA程序(不论Runable JAR还是Web Container)运行后,其进程名都是java/java.exe,只能通过JAVA进程的args来区分
如何通过一种简单的方法保证一台主机上同时只运行一个Runable JAR实例,经过一些百度Google之后,最终选定文件锁的方案,基本思路如下
程序实现
程序实现如下
获取文件锁
/*** <p>* <b>文件锁</b>* <p>* <pre>* 文件锁,起到只能有一个实例运行的效果* 使用 getLock,若为null则锁失败,反之锁成功* 锁失败,则有可能已有程序对此文件加独占锁,既已有程序正在运行* </pre>** @author ManerFan 2015年6月10日*/
public class InstanceLock {private RandomAccessFile rf;private FileLock lock;public InstanceLock(File file) {try {if (null == file) {return;}if (!file.exists()) {file.createNewFile();}if (!file.isFile()) {return;}rf = new RandomAccessFile(file, "rws");FileChannel channel = rf.getChannel();lock = channel.tryLock(0, Long.MAX_VALUE, false);} catch (IOException e) {e.printStackTrace();return;}}public void release() {if (null != rf) {try {rf.close();} catch (IOException e) {e.printStackTrace();}}if (null != lock) {try {lock.close();} catch (IOException e) {e.printStackTrace();}}}public FileLock getLock() {return lock;}
}
实际使用
在程序启动的地方监测是否已有实例在运行
/*** 判断是否已经有实例启动*/final InstanceLock lock = new InstanceLock(new File(ExePath, "lock"));if (null == lock.getLock()) {LOGGER.warn("Already Run.");System.exit(1);
}
在程序退出的地方释放文件锁
new ShutdownHook() {@Overridepublic void release() {/* 释放文件锁资源 */lock.release();}
}.register();
JAVA文件锁之保证仅有一个实例运行相关推荐
- elastic-job 是如何保证分布式环境下任务只有一个实例运行
本文适合使用过elastic-job的人,不会介绍如何使用elastic-job,因为如何使用已经有官方文档介绍了. 最近研究了几个分布式作业调度框架,最终从xxl-job elastic-job l ...
- 通过文件锁 Lockfile/flock 让脚本单实例运行
2019独角兽企业重金招聘Python工程师标准>>> 1.Perl File::Lockfile 模块 用Perl写了一些监控脚本,放在crontab中调度执行.有时候会发现一个脚 ...
- java 同步 实例_Java 1.4同步:仅允许方法的一个实例运行(非...
使用某种形式的锁定机制仅在尚未执行任务时执行它.获取锁定令牌必须是一个一步的过程.看到: /** * @author McDowell */ public abstract class Nonconc ...
- java程序怎么都不是一个_java运行的流程-怎么运行java程序编了一个程序不知道怎么运行郁闷啊后缀文件名是 爱问知识人...
在初学java编程语言时,痛苦的事莫过于跟着示例一步步做,总是得不到想要的结果,这是很多初学者都会碰到的问题.下面详细教你运行第一个java应用程序(环境windows xp + jdk 6.0): ...
- 单例模式——一个类只有一个实例
目录 一.基础简介 1.定义 2.使用场景 3.优缺点 4.模式分析 二.代码实现 1.sington类 2.代码分析 一.基础简介 1.定义 保证一个类仅有一个实例,并提供一个全局访问点 2.使用场 ...
- 深入理解单例模式——只有一个实例
我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 35k+ Star.会一直完善下去,欢迎建议和指导,同时也欢迎Star: https://github.com/Snailclim ...
- 转:让程序只运行一个实例的四种方法
先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...
- java interface 函数_Java8 函数式接口(Functional Interface),有且仅有一个抽象方法...
从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI) 定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口.为了保证接口符合 FI ,通常会在 ...
- 让Java程序只运行一个实例
一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...
最新文章
- 首个卡车全栈自动驾驶系统发布:嬴彻轩辕!年内量产上路
- hdu3613(扩展KMP)
- CentOS 5.3 已经发布!
- matlab图像处理函数大全
- linux普通用户发送信号,Linux信号发送与作业控制
- linux命令之less 命令
- 二叉查找树与平衡二叉树【转载】
- vue 使用了浏览器的刷新之后报错_vue调试工具vue-devtools的安装
- C# 利用反射动态将字符串转换成属性对应的类型值
- 暑假周进度总结报告8
- java需要下载哪些,全网最新
- acc 蓝牙_蓝牙耳机什么牌子好,哪个品牌的无线蓝牙耳机便宜好用
- 我的SQL相关TIPS
- Android eclipse中程序调试
- Eclipse中启动tomcat访问404解决及原因
- 小程序 发送模板消息的功能实现
- Qt绘制出思岚雷达扫描到的轮廓
- 论文笔记A Liver Segmentation Method Based on the Fusion of VNet and WGAN
- 谈谈那些基础但不简单的股票数据
- Quorum工作原理
热门文章
- 【前端工程化】windicss ,默认自带的字体颜色不好使,在背景色background-color中使用默认颜色的配置,windi.config.ts的配置注意事项
- IP地址、子网掩码、默认网关、DHCP服务器、DNS服务器、WINS服务器
- 重做Unbuntu 18.0.43 LTS系统 并为SLAM配置环境
- AcrelEMS-SW智慧水务能效管理平台在污水处理厂中的应用-Susie 周
- 桑坦德银行使用以太坊区块链赎回2000万美元债券
- 微信接口协议对比分析
- 您需要了解的有关Tesla Powerwall 2的一切(2020版)
- 深入浅出DPDK学习笔记(3)——— Cache和内存
- 算法,16瓶水,有一瓶有毒,假设一只小白鼠喝一滴水,一个小时后会死亡,一个小时找出那瓶有毒的水至少需要几只小白鼠?
- 【依存树】短语结构树转化依存树