思路

在实际项目开发中,要求一台主机上同时只能运行一个程序示例的情况并不少见,而这样的程序基本都是使用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. 首个卡车全栈自动驾驶系统发布:嬴彻轩辕!年内量产上路
  2. hdu3613(扩展KMP)
  3. CentOS 5.3 已经发布!
  4. matlab图像处理函数大全
  5. linux普通用户发送信号,Linux信号发送与作业控制
  6. linux命令之less 命令
  7. 二叉查找树与平衡二叉树【转载】
  8. vue 使用了浏览器的刷新之后报错_vue调试工具vue-devtools的安装
  9. C# 利用反射动态将字符串转换成属性对应的类型值
  10. 暑假周进度总结报告8
  11. java需要下载哪些,全网最新
  12. acc 蓝牙_蓝牙耳机什么牌子好,哪个品牌的无线蓝牙耳机便宜好用
  13. 我的SQL相关TIPS
  14. Android eclipse中程序调试
  15. Eclipse中启动tomcat访问404解决及原因
  16. 小程序 发送模板消息的功能实现
  17. Qt绘制出思岚雷达扫描到的轮廓
  18. 论文笔记A Liver Segmentation Method Based on the Fusion of VNet and WGAN
  19. 谈谈那些基础但不简单的股票数据
  20. Quorum工作原理

热门文章

  1. 【前端工程化】windicss ,默认自带的字体颜色不好使,在背景色background-color中使用默认颜色的配置,windi.config.ts的配置注意事项
  2. IP地址、子网掩码、默认网关、DHCP服务器、DNS服务器、WINS服务器
  3. 重做Unbuntu 18.0.43 LTS系统 并为SLAM配置环境
  4. AcrelEMS-SW智慧水务能效管理平台在污水处理厂中的应用-Susie 周
  5. 桑坦德银行使用以太坊区块链赎回2000万美元债券
  6. 微信接口协议对比分析
  7. 您需要了解的有关Tesla Powerwall 2的一切(2020版)
  8. 深入浅出DPDK学习笔记(3)——— Cache和内存
  9. 算法,16瓶水,有一瓶有毒,假设一只小白鼠喝一滴水,一个小时后会死亡,一个小时找出那瓶有毒的水至少需要几只小白鼠?
  10. 【依存树】短语结构树转化依存树