美文网首页js css html
多进程同步之文件锁

多进程同步之文件锁

作者: 尹学姐 | 来源:发表于2023-02-26 23:07 被阅读0次

在多线程的环境下,如果两个线程操作相同的竞争区,需要使用锁来保证线程安全。在Java中有多种选择,如Synchronized关键字,CountDownLatch等等。但是这些方式,在多进程的情况下,会失效。

那么在多进程情况下,我们怎么做进程同步呢?答案是文件锁。Java提供的FileLock类,可以实现,下面来看看具体的用法。

FileLock API

    public abstract FileLock lock(long position, long size, boolean shared) throws IOException;

    public final FileLock lock() throws IOException;

    public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException;
    
    public final FileLock tryLock() throws IOException;

方法:

  • lock方法,会block住线程,直到获取到锁。
  • tryLock方法,不会block,会直接返回,如果能获取到锁,则返回FileLock对象,如果获取不到锁,返回null

参数:

  • position:锁定文件中的开始位置
  • size:锁定文件中的内容长度
  • shared:是否使用共享锁。true为共享锁;false为独占锁。
    • 共享锁:允许其他进程同时获取
    • 独占锁:不允许其他进程同时获取

使用示例

进程1

    public static void main(String[] args) {
        try {
            // 打开文件
            FileOutputStream raf = new FileOutputStream("lock.txt");
            // 获取FileChannel
            FileChannel channel = raf.getChannel();
            // 获取FileLock,上锁
            FileLock lock = channel.lock();
            Thread.sleep(10000);
            // 手动释放FileLock
            lock.close();
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

进程1启动后,会获取FileLock锁,然后持有锁Sleep 10s。

进程2:

    public static void main(String[] args) {
        try {
            FileOutputStream raf = new FileOutputStream("lock.txt");
            FileChannel channel = raf.getChannel();
            // 会被block,直到获得锁
            FileLock lock = channel.lock();
            // 如果没有获得锁,直接返回null,不会被block  
            lock = channel.tryLock();
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

此时进程2启动:

  • 如果调用lock方法,会block线程,直到进程1释放锁。
  • 如果调用tryLock方法,不会block,会直接返回,如果能获取到锁,则返回FileLock对象,如果获取不到锁,返回null

总结

FileLock可以用于Android中多进程同步,有以下几点需要注意:

  1. 如果同一个进程中的不同线程,同时对一个文件进行加锁操作,会直接抛出异常:java.nio.channels.OverlappingFileLockException
  2. FileLock释放的条件是,手动调用release/close释放,或JVM终止运行。
  3. 本质也是调用Linuxfnctl来从内核对文件进行加锁。
  4. 同一个FileChannel只能被使用一次,如果调用close只有,再去调用lock,会报ClosedChannelExcption

相关文章

  • 多进程同步之文件锁

    在多线程的环境下,如果两个线程操作相同的竞争区,需要使用锁来保证线程安全。在Java中有多种选择,如Synchro...

  • 线程同步-锁

    进程同步-锁 互斥锁 模拟抢票程序: 在多个进程要对同一个文件进行修改时,要避免出现多个进程同时修改的情况,这种情...

  • 计算机基础-操作系统提升篇

    一,线程,进程同步 为什么需要同步 1.线程同步 以下都是对资源加锁 互斥量(互斥锁)逻辑开始加个锁,结束再解锁,...

  • Linux下的信号量使用

    信号量 信号量原语 进程同步的主要方式之一。具体概念参考[《《操作系统概念精要》基本概念整理之进程同步篇(二)》]...

  • 进程相关问题学习

    写在前面,进程同步控制有锁,信号量,事件进程间通信有 队列和管道 信号量相当于多个锁 事件控制进程的动作 红绿灯问...

  • 操作系统(二)进程管理 2.3 进程同步

    2.3 进程同步 2.3.1 进程同步的基本概念 2.3.1.1 进程同步 进程具有异步性的特征。异步性是指,各并...

  • 10.文件锁

    pa文件,对文件加读锁 pb文件,对文件加写锁 pc文件

  • Android基础(15)数据存储方式

    1)文件2)SharedPreference。如何进程安全SP是进程同步的吗?有什么方法做到同步?3)数据库4)内...

  • Java中的同步与异步

    进程同步用来实现程序并发执行时候的可再现性。 一.进程同步及异步的概念 1.进程同步:就是在发出一个功能调用时,在...

  • 同步与异步

    进程同步用来实现程序并发执行时候的可再现性。 进程同步及异步的概念 1.进程同步:就是在发出一个功能调用时,在没有...

网友评论

    本文标题:多进程同步之文件锁

    本文链接:https://www.haomeiwen.com/subject/xymcldtx.html