`

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

    博客分类:
  • J2SE
阅读更多
采用了一个核心类: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();

 
分享到:
评论

相关推荐

    操作系统课程设计报告 实现多线程通信同步互斥内存管理文件管理

    操作系统课程设计报告 实现多线程通信同步互斥内存管理文件管理 图文并茂。

    Linux系统编程之线程同步

    每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。 资源还是共享的,线程间也还是竞争的, 但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。 但,...

    操作系统 线程的同步

    VC6.0实现线程的同步cpp文件,亲测可运行

    多线程同步方法解决生产者-消费者问题(linux线程实现)

    设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...

    Delphi多对象等待实现的线程同步

     本示例用于演示Delphi多对象等待实现的线程同步问题。运行示例程序,并尝试在输入框中输入有效的目录名,然后按下“添加到监视列表”按钮。  到被监视的目录中,做一些文件或者目录操作,例如创建文件、更名等。...

    多线程同步

    实现不同线程独立完成自己的任务,每个线程的任务都是向文件写入指定的字符

    Java多线程与线程安全实践-基于Http协议的断点续传的实现.rar

    在下载管理器中实现多线程下载的逻辑,包括文件分块、断点续传等功能。 使用线程池来管理下载任务的线程,可以提高线程的复用性和效率。 在下载过程中处理线程同步和资源释放,确保线程安全性和资源的正确释放。 ...

    JAVA文件传输的实现.rar

    Java文件传输是指在客户端和服务器之间通过网络传输文件的过程,可以实现文件的上传、下载和共享功能。 该实现通常基于TCP/IP或UDP等网络协议,确保文件在传输过程中的可靠性和稳定性。 功能特点: 文件上传:...

    JAVA多线程运用

    1. 建立三个线程,并且同时运行它们。...(3)、在定义Storage类中的setValue(int i) 和getValue ()方法时使用synchronized关键字,将其定义为同步方法 (4)、保存文件,调试并编译运行程序。 参考程序运行效果:

    Python多线程实现同步的四种方式

    临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区。 锁机制 threading的Lock类,用该...

    C语言开发的单链表实现的线程安全型数据结构.zip

    (2)其次创建两个线程分别对链表多次进行插入节点操作和多次删除插入操作,通过简单的互斥机制实现两个线程同时启用,相互不会发生冲突,实现互斥模型,主要验证方式是打印要插入节点数,删除节点数,删除失败节点...

    操作系统实验——进程的同步与互斥(读者写者问题)

    以生产者消费者模型为基础,在Windows环境下创建一个控制台进程,在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,...

    基于C语言实现操作系统内存管理【100010846】

    创建一个包含两个线程的进程:线程 t1 和线程 t2,进程 p1 通过执行一系列内存操作来模拟内存分配活动,线程 t2 用于跟踪线程 t1 的内存行为,两个线程通过信号量进行同步。 线程 t1 执行的内存操作类型包括:分配...

    基于C++进行操作系统课程设计实验【100013085】

    2、通过实验三,我在 Nachos 上利用信号量实现了线程同步。阅读源码和理论课程相结合,对线程调度、线程切换、线程同步、生产者消费者模型等概念有了更深入的理解。 3、通过实验四和实验五,我在 Nachos 实现了具有...

    操作系统课程设计 模拟页面置换算法的实现 基于Qt

    该系统使用的程序设计语言是C++,采用Qt框架开发,其中算法实现时使用了QList、QMap、QQueue等类,借助于QThread类来实现四个线程的同步,对线程的挂起等操作使用了QMutex、QWaitCondition等类。系统中还涉及对音...

    操作系统课程设计生产者和消费者问题源代码

    而消费者之间只有在对同一产品进行消费时才需要互斥,同时它们在消费过程结束时需要判断该消费对象是否已经消费完毕并清除该产品。 Windows用来实现同步和互斥的实体。在Windows中,常见的同步对象有:信号量...

    Java毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传.rar

    Java多线程与线程安全实践-基于Http协议的断点续传.rar 是一个Java毕业设计项目,旨在探讨如何在Java中实现多线程和线程安全,以及如何基于Http协议实现断点续传功能。该项目提供了一个完整的源代码包,可以作为学习...

    操作系统课程实验.rar

    通信的 具体内容可根据自己的需要随意设计,要求能试验阻塞型读写过程中的各种情况,测试管道 的默认大小,并且要求利用 Posix 信号量机制实现进程间对管道的互斥访问。运行程序,观 察各种情况下,进程实际读写的...

    多进程同步方法解决生产者-消费者问题(linux线程实现)

    设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...

    多线程实现的Java爬虫程序

    以下是一个Java爬虫程序,它能从指定主页开始,按照指定的深度抓取该站点域名下的网页并维护简单索引。  参数:private static int...  本程序用到了多线程(静态变量和同步),泛型,文件操作,URL类和连接,Hashtabl

Global site tag (gtag.js) - Google Analytics