zoukankan      html  css  js  c++  java
  • Java使用FileLock实现Java进程互斥锁

    原理:
    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. 实现简单, 功能强大.

  • 相关阅读:
    1044 拦截导弹
    3060 抓住那头奶牛 USACO
    2727:仙岛求药(广搜)
    4906 删数问题(另一种贪心思路)
    1004 四子连棋
    1005 生日礼物
    1031 质数环
    1008 选数
    1073 家族
    2801 LOL-盖伦的蹲草计划
  • 原文地址:https://www.cnblogs.com/zolo/p/5849250.html
Copyright © 2011-2022 走看看