一、java.io.RandomAccessFile锁文件
例子:
public static void main(String[] args) throws IOException {
// RandomAccessFile可以随机访问文件,实例化RandomAccessFile对象时,会在文件系统生成
// 文件C:/Users/alvin/Desktop/test2.txt,test2.txt文件为空
RandomAccessFile randomAccFile = new RandomAccessFile("C:/Users/alvin/Desktop/test2.txt", "rwd");
// 拿到FileChannel对象
FileChannel fileChannel = randomAccFile.getChannel();
//尝试获取FileLock,tryLock()方法会立刻返回,拿不到锁时,返回null,请求的是非共享锁
FileLock fileLock = fileChannel.tryLock();
// 判断锁是否为共享锁(取决于操作系统)
boolean isShared = fileLock.isShared();
//释放锁
fileLock.release();
//关闭channel时,会释放掉channel上所有锁
fileChannel.close();
randomAccFile.close();
}
二、java.nio.file.Path锁文件
例子:
public static void main(String[] args) throws IOException {
Path p = Paths.get("C:/Users/alvin/Desktop/test3.txt");
// 要求路径对应的文件必须在文件系统真实存在
FileChannel fileChannel = FileChannel.open(p, StandardOpenOption.WRITE);
// 尝试获取FileLock,tryLock()方法会立刻返回,拿不到锁时,返回null,默认请求的是非共享锁。
FileLock fileLock = fileChannel.tryLock();
// 判断锁是否为共享锁(取决于操作系统)
boolean isShared = fileLock.isShared();
// 释放锁
fileLock.release();
// 关闭channel时,会释放掉channel上所有锁
fileChannel.close();
}
思考:以上两种方式,在对文件加锁前,都要求文件存在文件系统中,会出现如下问题:
第一步:应用A向文件中写内容,应用B要读A写的内容。应用A在对文件加锁前,应用B将空的文件内容读走。