歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 文件加鎖(基於FileChannel)

文件加鎖(基於FileChannel)

日期:2017/3/1 9:39:03   编辑:Linux編程

JDK1.4引入了文件加鎖機制。它允許我們同步訪問某個作為共享資源的文件。不過,競爭同一文件的兩個線程可能在不同的Java虛擬機上,或者一個是Java線程,另一個是操作系統中的其他的某個本地線程。文件加鎖對其他的操作系統進程是可見的,因為Java的文件加鎖直接映射到了本地操作系統的枷鎖工具。

通過對FileChannel調用tryLock()或者lock(),就可以獲得整個文件的FileLock。其中tryLock()是非阻塞式的,它設法獲得鎖,如果不能獲得(其他的一些進程已經持有相同的鎖,並且不共享),它將直接從方法調用返回。lock()則是阻塞式的,它要阻塞進程直至鎖可以獲得,或者調用lock()的線程中斷(就是自己先掛掉了),或調用lock()的通道關閉。使用FileLock.release()可以釋放鎖。


FileOutputStream fos = new FileOutputStream(new File("lock.tct"));

FileLock fl = fos.getChannel().tryLock();

if(fl!=null) {

XXXX//各種文件操作

fl.release(); //釋放鎖

}

fos.close();


也可以通過如下方法對文件的一部分上鎖

tryLock(long pos , long size , boolean shared)
lock(long pos , long size , boolean shared)
//加鎖的區域由size-position決定。第三個參數指定是否是共享鎖


無參數的加鎖方法將根據文件尺寸的變化而變化,而固定尺寸的鎖不隨文件尺寸的變化而變化。如果你在某一區域上加鎖了,那麼當文件增大的時候,加鎖區域還是那個區域,多出的區域不會被鎖定。而無參數的時候,是對整個文件進行加鎖,文件變大後,也是對整個文件進行加鎖。

Copyright © Linux教程網 All Rights Reserved