美文网首页
文件锁定

文件锁定

作者: 挺搞笑的 | 来源:发表于2016-07-21 17:52 被阅读75次
    • Java中NIO的文件锁定在很大程度上依赖操作系统的实现。并非所有的操作系统都支持共享锁(shared locks),在操作系统不支持共享锁的情况下,对于文件共享锁的请求将变成对于独占锁(exclusive locks)的请求。这保证了准确性,但是会降低性能。通道的isShared()方法可以判断锁是共享锁还是独占锁。
    • 文件锁锁定的对象是文件而不是通道或者线程,如果我们的目的是要控制多个线程的并发访问,需要自己实现锁定方案(内存映射文件)。
    • 带参数形式的lock()方法,锁会在文件内部区域获得,position指定开始锁定的位置,size指定锁定区域的大小,shared表示锁是否为共享锁(true为共享锁,false为独占锁)。锁定的范围可以超出文件尾,也可以是文件的任何一个区域,但不能为负数。锁定的区域会被受到保护。
    • 如果在请求一个文件锁时,该文件已经被锁定,那么lock()方法会被阻塞,它必须等待前面的锁被释放,如果此时线程被阻塞,该线程将受到中断语义控制。我们可以调用channel的channel()方法获得Lock的创建通道。
    • tyrLock()方法与lock()方法起相同的作用,它是lock()方法的非阻塞变体,如果请求的锁不能立即获得,它将返回null。
    • 一个文件锁被创建以后,只有锁被释放、通道被关闭、或者jvm关闭时才会失效。isValid()方法可以检测一个锁的有效性。overlaps()方法可以查询一个你感兴趣的地方与你的锁是否有交集。
    • 确保你的锁被释放,以避免可能发生的冲突和死锁。
     FileLock lock = channel.lock();
     try {
    
     } catch (Exception e) {
        // TODO
     } finally {
        lock.release();
     }
    
    • 示例代码
    RandomAccessFile accessFile = new RandomAccessFile(new File("d:\\a.txt"), "rw");
    FileChannel channel = accessFile.getChannel();
    FileLock lock = channel.lock(0L, 50, false);
    System.out.println(lock.isShared());
    System.out.println(lock.isValid());
    System.out.println(lock.overlaps(1, 100));
    System.out.println(lock.overlaps(60, 100));
    Thread.sleep(10000);
    lock.release();
    Thread.sleep(10000);
    accessFile.close();
    

    1.如果lock()的最后一个参数为true,当该代码执行时,其它** 进程 可以正常读,但是不能写,直到锁被释放。
    2.如果lock()的最后一个参数为false,当该代码执行时,其它
    进程 **既不能读,也不能写,直到锁被释放。

    相关文章

      网友评论

          本文标题:文件锁定

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