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
某些平臺上,文件鎖僅僅是建議性的,並非強制性的,這也就是說即使一個程序不能獲取文件鎖,他也可以對該文件進行讀寫
某些平臺上,不能同步地鎖定一個文件並把它映射到內存中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章