编程语言
首页 > 编程语言> > Java NIO FileLock

Java NIO FileLock

作者:互联网

FileLock简介

文件锁在OS中很常见,如果多个程序同时访问、修改一个文件,很容易因为文件数据不同步而出现问题。给文件加一个锁,同一时间,只能有一个程序修改此文件,或者程序都只能读此文件,这就解决了同步问题。

文件锁是进程级别的,不是线程级别的。文件锁可以解决多个进程并发访问、修改同一文件的问题,但不能解决多线程并发访问、修改同一文件的问题。

使用文件锁时,同一进程内的多个线程,可以同时访问、修改此文件。

文件锁是当前程序所属的JVM实例持有的,一旦获取到文件锁,要调用release(),或者关闭对应的FileChannel对象,或者当前JVM退出,才会释放这个锁。

一旦某个进程(比如JVM实例)对某个文件加锁,则在释放这个锁之前,此进程不能再对此文件加锁,就是说JVM实例在同一文件上的文件锁是不重叠的(进程级别不能重复在同一文件上获取锁)。

文件锁分类

获取文件锁方法

lock与tryLock的区别

lock是阻塞式的,如果未获取到文件锁,会一直阻塞当前线程,直到获取文件锁。tryLock和lock的作用相同,只不过tryLock是非阻塞的,tryLock是尝试获取文件锁,获取成功就返回锁对象,否则返回null,不会阻塞当前线程。

FileLock两个方法

使用示例

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class FileLockDemo1 {

    public static void main(String[] args) throws IOException {
        String input = "abc";
        System.out.println(input);

        ByteBuffer buf = ByteBuffer.wrap(input.getBytes());

        String filePath = "d:\\qrxqrx\\01.txt";
        Path path = Paths.get(filePath);
        FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.WRITE,StandardOpenOption.APPEND);
        fileChannel.position(fileChannel.size()-1);

        //写文件
        FileLock lock = fileChannel.lock();
        System.out.println("是否为共享锁:"+lock.isShared());
        fileChannel.write(buf);
        fileChannel.close();

        //读文件
        FileReader fileReader = new FileReader(filePath);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String s = bufferedReader.readLine();
        System.out.println(s);
        fileReader.close();
        bufferedReader.close();
    }

}

标签:文件,FileLock,Java,NIO,java,lock,加锁,进程,import
来源: https://blog.csdn.net/qq_41242680/article/details/120447693