原理:
JDK的nio包中FileLock实现类似Linux fcntl的文件锁, 可使文件被进程互斥访问.  借助此功能, 可以实现强大的Java进程互斥锁, 从而在应用层面保证同一时间只有惟一的Jar应用进程在运行! 避免某些因素导致jar重复执行, 多个进程产生竞争,破坏业务数据. (当然, 你可以借助类似ubuntu的upstart脚本或者ps -p <pid>之类的做法来做到相同的功能).
实现:

  1. package test;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.RandomAccessFile;
  5. import java.nio.channels.FileChannel;
  6. import java.nio.channels.FileLock;
  7. import java.util.concurrent.Callable;
  8. import java.util.concurrent.TimeUnit;
  9. public class FileLockTest {
  10. public static void main(String[] args) throws Exception {
  11. exclusiveWithFileLock(new Callable<Void>() {
  12. @Override
  13. public Void call() throws Exception {
  14. TimeUnit.SECONDS.sleep(10); // 使用休眠模拟业务逻辑
  15. return null;
  16. }
  17. });
  18. }
  19. public static <V> V exclusiveWithFileLock(Callable<V> caller)
  20. throws Exception {
  21. File lockFile = new File("/tmp/"+FileLockTest.class.getCanonicalName());//使用类名做为文件名称
  22. if (!lockFile.exists()) {
  23. if (!lockFile.getParentFile().exists()) {
  24. lockFile.getParentFile().mkdirs();
  25. }
  26. if (!lockFile.createNewFile()) {
  27. throw new IOException("create lock file failed! ");
  28. }
  29. }
  30. FileChannel fc = null;
  31. try {
  32. fc = new RandomAccessFile(lockFile,"rw").getChannel();
  33. FileLock lck = fc.tryLock();
  34. if (lck == null) {
  35. System.out.println("File is lock by another programme");
  36. System.exit(1);
  37. } else {
  38. System.out.println("Do your work here...");
  39. return caller.call();
  40. }
  41. } finally {
  42. if (fc != null) {
  43. fc.close();
  44. }
  45. }
  46. return null;
  47. }
  48. }

复制代码

结果:

  1. xuser@pc120:~/myworkspace/source/jademo/src$ java test.FileLockTest
  2. File is lock by another programme
  3. xuser@pc120:~/myworkspace/source/jademo/src$ java test.FileLockTest
  4. Do your work here...

复制代码

优势:
1. 实现简单, 功能强大.

Java使用FileLock实现Java进程互斥锁的更多相关文章

  1. (day29) 进程互斥锁 + 线程

    目录 进程互斥锁 队列和堆栈 进程间通信(IPC) 生产者和消费者模型 线程 什么是线程 为什么使用线程 怎么开启线程 线程对象的属性 线程互斥锁 进程互斥锁 进程间数据不共享,但是共享同一套文件系统 ...

  2. 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发

    子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...

  3. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  4. 守护进程,互斥锁,IPC,队列,生产者与消费者模型

    小知识点:在子进程中不能使用input输入! 一.守护进程 守护进程表示一个进程b 守护另一个进程a 当被守护的进程结束后,那么守护进程b也跟着结束了 应用场景:之所以开子进程,是为了帮助主进程完成某 ...

  5. 4 并发编程-(进程)-守护进程&互斥锁

    一.守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束 ...

  6. Python守护进程、进程互斥锁、进程间通信ICP(Queue队列)、生产者消费者模型

    知识点一:守护进程 守护进程:p1.daemon=True 守护进程其实就是一个“子进程“,守护=>伴随 守护进程会伴随主进程的代码运行完毕后而死掉 进程:当父进程需要将一个任务并发出去执行,需 ...

  7. 8.9 day30 并发编程 进程理论 进程方法 守护进程 互斥锁

    多道技术 1.空间上的复用 多个程序共用一套计算机硬件 多道技术原理 2.时间上的复用 ​ 切换+保存状态 ​ 1.当一个程序遇到IO操作 操作系统会剥夺该程序的CPU执行权限( 提高了CPU的利用率 ...

  8. python并发编程-进程理论-进程方法-守护进程-互斥锁-01

    操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) ...

  9. 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)

    目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...

随机推荐

  1. HTTP 500.22 错误解决

    打开网站对应的应用池-->高级设置-->托管管道模式改为classic

  2. OSGI.NET 学习笔记(一)

    1. 关于OSGI.NET 在介绍 OSGI.NET 前先介绍下OSGi, OSGI全称为Open Service Gateway Initiative,它一方面指由IBM.Oracle.BEA.SA ...

  3. js 数组对象,数组的使用

    var a =new Array(1,2,3,4,'a','b','c',{x:1,y:2}); alert(a[7].x); //数组之中可以定义数组. var b=['a','b','c']; c ...

  4. Digest [information value filtering]

    http://oak.cs.ucla.edu/~cho/papers/cho-filter.pdf 最近对评估方法进行研究,这篇paper是一种对IR方法进行总结,不错的角度,也比较全面

  5. C#之泛型

    泛型是C# 2.0版本才有的语言特性,是具有参数类型占位符的类.结构.接口和方法.这些占位符是类.结构.接口和方法所存储或使用的一个或多个占位符.简单来说,就是变量类型的参数化. 以下是详细demo: ...

  6. NSBundle 的使用

    NSBundle 读取图片 plist text NSBundle *mainbundle=[NSBundle mainBundle]; //使mainBundle 对象获取图片的路径 NSStrin ...

  7. The difference between macro and function I/Ofunction comparision(from c and pointer )

    macro is typeless and execute faster than funtion ,becaus of the overhead of calling and returnning ...

  8. HiveSQL解析过程详解 | 学步园

    HiveSQL解析过程详解 | 学步园   http://www.xuebuyuan.com/2210261.html

  9. 从汇编层面深度剖析C++虚函数

    文章出处:http://blog.csdn.net/linyt/article/details/6336762 虚函数是C++语言实现运行时多态的唯一手段,因此掌握C++虚函数也成为C++程序员是否合 ...

  10. JQuery Validate使用总结

    本文参考了  http://www.cnblogs.com/linjiqin/p/3431835.html 可以在mvc 或webform项目中使用,可以方便快捷的对前端表单进行校验 一.导入两个js ...