Java面向对象系列[v1.0.0][FileLock]

FileLock的功能和用法

如果多个程序需要并发修改同一个文件,程序之间就需要某种机制来进行通信,使用文件锁可以有效的阻止多个进程并发修改同一个文件
从JDK1.4的NIO开始,Java开始提供文件锁的支持,在FileChannel中提供的lock()/tryLock()方法可以获得文件锁FileLock对象,从而锁定文件

  • lock():当lock()试图锁定某个文件时,如果无法得到文件锁,程序将一直阻塞
  • tryLock():当tryLock()尝试锁定文件时,它会直接返回而不是阻塞,如果获得了文件锁,该方法则返回该文件锁,否则返回null


如果FileChannel只想锁定文件的部分内容,则可以使用如下方式:

  • lock(long position, long size, boolean shared):对文件从position开始,长度为size的内容加锁,该方法是阻塞式的
  • tryLock(long position, long size, boolean shared):非阻塞式的加锁方式,参数的作用与上一个方法类似

当参数shared为true时,表明该锁是一个共享锁,它允许多个进程来读取该文件,但阻止其他进程获得该文件的排它锁,当shared为false时,表明该锁是一个排它锁,它将锁住对该文件的读写,程序可以通过调用FileLock的isShared来判断它获得锁是否为共享锁;直接使用lock()或tryLock()方法获取的文件锁是排它锁;处理完文件后通过FileLock的release()方法释放文件锁

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class FileLockTest
{
	public static void main(String[] args)
		throws Exception
	{

		try (
			// 使用FileOutputStream获取FileChannel
			var channel = new FileOutputStream("a.txt").getChannel())
		{
			// 使用非阻塞式方式对指定文件加锁
			FileLock lock = channel.tryLock();
			// 程序暂停10s
			Thread.sleep(10000);
			// 释放锁
			lock.release();
		}
	}
}

文件锁是由Java虚拟机所持有的,如果两个Java程序使用同一个Java虚拟机运行,则他们不能对同一个文件进行加锁
关闭FileChannel时,会释放Java虚拟机在该文件上的所有锁,因此应该避免对同一个被锁定的文件打开多个FileChannel
某些平台上,文件锁仅仅是建议性的,并非强制性的,这也就是说即使一个程序不能获取文件锁,他也可以对该文件进行读写
某些平台上,不能同步地锁定一个文件并把它映射到内存中

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/106498491
今日推荐