怎样在不同线程间实现对文件的同步操作

本文介绍了一种使用Apache Commons IO库中的LockableFileWriter类来实现文件锁定与解锁的方法,通过循环尝试获取锁并进行业务操作,确保文件在使用过程中不被其他进程干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

采用了一个核心类:org.apache.commons.io.output.LockableFileWriter

该类在实例化的时候会在临时文件夹创建一个lock文件,close的时候删除该lock文件。
根据这个lock的存在与否来判断目标文件是否被锁定。

如果目标文件使用中,那么创建lock文件会抛出异常。

拿锁的代码

//如果文件被锁,那么就持续的尝试拿锁60秒
    LockableFileWriter writer = null;
    int step = 0;
    while(null == writer && step < 60){
     try {
      writer = new LockableFileWriter(file);
     } catch (IOException e) {
       try {
        this.wait(1000);
       } catch (InterruptedException e1) {
        logger.error(e1);
       }
       step++;
     }
    }
  
    if(null == writer){
     return;
    }

 

释放锁的代码

 

try {
     writer.close();
    } catch (IOException e) {
     logger.error(" 释放锁出错", e);
    }

 

如果不想打开文件,但是又想锁定文件,不让LockableFileWriter 用。那么只好直接操作那个lock文件了。

 

//拿锁

String destFile = xxxxx.txt;

File lockFile = null;
   boolean isLockCreated = false;
   int step = 0;
   while(isLockCreated == false && step < 60){
    String lock = System.getProperty("java.io.tmpdir") + "/" + destFile + ".lck";
    lockFile = new File(lock);
    try {
     isLockCreated = lockFile.createNewFile();
     if(!isLockCreated){
      try {
       this.wait(1000);
      } catch (InterruptedException e) {
       logger.error(e);
      }
     }
    } catch (IOException e) {
     try {
      this.wait(1000);
     } catch (InterruptedException e1) {
      logger.error(e1);
     }
    
     logger.error(e);
    }
   
   
    step++;
   }
  
   if(false == isLockCreated || null == lockFile){
    return;
   }

/*业务操作*/

//放锁
lockFile.deleteOnExit();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值