思路

在实际项目开发中,要求一台主机上同时只能运行一个程序示例的情况并不少见,而这样的程序基本都是使用C/C++等语言开发
作为毕业后不久就一直使用JAVA开发的我来讲,最近就遇到了一台主机上同时只能运行一个JAVA实例(Runable JAR)的问题
JAVA不像C/C++等其他编译型语言,程序运行后可以通过进程名来区分是否已经有示例正在运行,JAVA程序(不论Runable JAR还是Web Container)运行后,其进程名都是java/java.exe,只能通过JAVA进程的args来区分
如何通过一种简单的方法保证一台主机上同时只运行一个Runable JAR实例,经过一些百度Google之后,最终选定文件锁的方案,基本思路如下

Created with Raphaël 2.1.0程序启动锁文件是否存在?获取文件锁是否能获取到锁?程序正常流程退出创建锁文件yesnoyesno

程序实现

程序实现如下

获取文件锁

/*** <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文件锁之保证仅有一个实例运行相关推荐

  1. elastic-job 是如何保证分布式环境下任务只有一个实例运行

    本文适合使用过elastic-job的人,不会介绍如何使用elastic-job,因为如何使用已经有官方文档介绍了. 最近研究了几个分布式作业调度框架,最终从xxl-job elastic-job l ...

  2. 通过文件锁 Lockfile/flock 让脚本单实例运行

    2019独角兽企业重金招聘Python工程师标准>>> 1.Perl File::Lockfile 模块 用Perl写了一些监控脚本,放在crontab中调度执行.有时候会发现一个脚 ...

  3. java 同步 实例_Java 1.4同步:仅允许方法的一个实例运行(非...

    使用某种形式的锁定机制仅在尚未执行任务时执行它.获取锁定令牌必须是一个一步的过程.看到: /** * @author McDowell */ public abstract class Nonconc ...

  4. java程序怎么都不是一个_java运行的流程-怎么运行java程序编了一个程序不知道怎么运行郁闷啊后缀文件名是 爱问知识人...

    在初学java编程语言时,痛苦的事莫过于跟着示例一步步做,总是得不到想要的结果,这是很多初学者都会碰到的问题.下面详细教你运行第一个java应用程序(环境windows xp + jdk 6.0): ...

  5. 单例模式——一个类只有一个实例

    目录 一.基础简介 1.定义 2.使用场景 3.优缺点 4.模式分析 二.代码实现 1.sington类 2.代码分析 一.基础简介 1.定义 保证一个类仅有一个实例,并提供一个全局访问点 2.使用场 ...

  6. 深入理解单例模式——只有一个实例

    我自己总结的Java学习的系统知识点以及面试问题,已经开源,目前已经 35k+ Star.会一直完善下去,欢迎建议和指导,同时也欢迎Star: https://github.com/Snailclim ...

  7. 转:让程序只运行一个实例的四种方法

    先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...

  8. java interface 函数_Java8 函数式接口(Functional Interface),有且仅有一个抽象方法...

    从 Java 8 开始便出现了函数式接口(Functional Interface,以下简称FI) 定义为: 如果一个接口只有唯一的一个抽象接口,则称之为函数式接口.为了保证接口符合 FI ,通常会在 ...

  9. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

最新文章

  1. 突变检测软件 测试数据库,合作文章|变异检测软件技能大PK,谁才是Battle King?...
  2. 惨!重新申请了网页的Counter
  3. How to mannuly configure vmtools in VM-Ware?
  4. Python Text I/O
  5. mac怎么无线打印机连接到服务器,苹果电脑连接wifi打印机的方法
  6. Git初学(5)--关联远程库
  7. 火狐浏览器下载慢,如何提高
  8. 微信小程序列表图片加载错误处理
  9. Android机应用多开分身CK获取ksjsb-jrttjsb-aqc羊毛
  10. powerbi 线性回归_精选 | 实用炫酷的Power BI自定义图表
  11. Windows10启用Administrator并设置任意密码(包括空密码)【解决Administrator默认没有Administrator权限的Windows默认鬼畜(有毒)设置】
  12. 如何画好软件架构图?为什么说我们需要软件架构图?
  13. 基于qiankun搭建ng-alain15微前端项目示例实践
  14. 中国石化广西石油在加油站增设“爱心驿站”
  15. vue组件库大全(忘了的时候可以进来找一下~)
  16. 一个软件项目经理的心得和经验
  17. MATLAB模型预测控制(MPC)示例
  18. Aria2 for Mac (免HomeBrew)
  19. 模拟高校的三个老师同时分发80份学习笔记
  20. 舒舍分析现在的北京租房市场

热门文章

  1. 三菱FA产品QD62D型高速计数器模块的应用
  2. Python学习笔记(八)—— 私有属性、私有方法、伪私有
  3. 计算机运行内存和内存条吗,电脑的“内存”和手机的“运行内存”是一回事吗?...
  4. CY7C68013与FPGA接口的Verilog_HDL实现
  5. solor5.4学习笔记
  6. NONCODE:综合性的lncRNA数据库
  7. 一秒学会CSS阴影效果
  8. JQuery实现超链接和图片提示预览效果
  9. aws云服务模拟应用localstack
  10. html()函数用法