使用Java锁文件的方法

一、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将空的文件内容读走。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值