在Java中應(yīng)用文件鎖

文件鎖在操作系統(tǒng)中是很平常的事情,當(dāng)多個運(yùn)行的程序需要并發(fā)修改同一個文件時,程序之間需要某種機(jī)制來進(jìn)行通信,使用文件鎖可以有效的阻止多個進(jìn)程并發(fā)修改同一個文件,所以現(xiàn)在的大部分操作系統(tǒng)都提供了文件鎖的功能。

????從JDK1.4的NIO開始,Java開始提供文件鎖的支持。文件鎖控制文件的全部或者部分字節(jié)的訪問。

????在NIO中,Java提供了FileLock來支持文件鎖定功能,在FileChannel中提供了lock()和tryLock()方法來獲得文件鎖FileLock對象,從而鎖定文件。

????lock()和tryLock()方法存在區(qū)別:

  • 使用lock()嘗試鎖定某個文件時,如果獲得了文件鎖,該方法就會返回該文件鎖,否則返回null。
  • 使用tryLock()嘗試鎖定文件時,它將直接返回而不是阻塞。如果獲得了文件鎖,那么該方法將會返回文件鎖,否則返回null。

????如果FileChannel只是想要鎖定文件的部分內(nèi)容而不是鎖定全部內(nèi)容,則可以像如下的方法一般使用:

  • lock(long position,long size,boolean shared)對文件從position開始,長度為size的內(nèi)容加鎖,該方法是阻塞式的。
  • tryLock(long position,long size,boolean shared)非阻塞式的加鎖方法。

????當(dāng)shared參數(shù)為true時,表示該鎖是一個共享鎖,允許多個進(jìn)程來讀取該文件,但是阻止其他進(jìn)程獲得對該文件的排它鎖。當(dāng)shared為false時,表示該鎖是一個排它鎖,它將鎖住對該文件的讀寫。程序可以通過調(diào)用FileLock的isShared來判斷它獲得的鎖是否為共享鎖。

????處理完文件之后通過FileLock的release()方法釋放文件鎖。

????考慮下面這個示例:

import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class FileLockTest {
    public static void main(String[] args){
        try(
                //使用FileOutputStream獲取FileChannel
                FileChannel channel = new FileOutputStream("a.txt").getChannel()
                )
        {
            //使用非阻塞方式對指定文件進(jìn)行加鎖
            FileLock lock = channel.tryLock();
            //程序暫停1秒
            Thread.sleep(1000);
            //釋放鎖
            lock.release();
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

????注意:

????文件鎖雖然可以用于控制并發(fā)訪問,但是對于高并發(fā)訪問的情形,還是推薦使用數(shù)據(jù)庫來保存程序信息。

????關(guān)于文件鎖,還要注意的幾點(diǎn)是:

  1. 在某些平臺上,文件鎖僅僅是建議性的,并不是強(qiáng)制性的。這意味著,即使一個程序不能獲得文件鎖,它也可以對該文件進(jìn)行讀寫。
  2. 在某些平臺上,不能同步的鎖定一個文件并把它映射到內(nèi)存中。
  3. 文件鎖是由Java虛擬機(jī)鎖持有的,如果兩個java程序使用同一個Java虛擬機(jī)運(yùn)行,則他們不能對同一個文件進(jìn)行加鎖。
  4. 在某些平臺上關(guān)閉FileChannel,會釋放Java虛擬機(jī)在該文件上的所有鎖,因此應(yīng)該避免對同一個被鎖定的文件打開多個FileChannel。

喜歡的話請掃碼支持一下~~
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至:http://www.cnblogs.com/ixenos/p/5863921.html Java NIO ...
    kkgo閱讀 1,526評論 0 1
  • 本文內(nèi)容非原創(chuàng),你可以點(diǎn)擊此處查看內(nèi)容來源聲明 輸入/輸出流 在Java API中,可以從其中讀出一個字節(jié)序列的對...
    _gitignore閱讀 2,791評論 0 0
  • 摘要: 我們已經(jīng)知道,synchronized 是Java的關(guān)鍵字,是Java的內(nèi)置特性,在JVM層面實現(xiàn)了對臨界...
    kingZXY2009閱讀 1,881評論 0 20
  • Channel 通道(Channel)的作用有類似于流(Stream),用于傳輸文件或者網(wǎng)絡(luò)上的數(shù)據(jù)。 上圖中,箭...
    德彪閱讀 520評論 0 1
  • 我們的第一個釣魚計劃泡湯了,但我從第二個吃牛排計劃里找到屬于我自己的快樂。 我們從北湖公園走到牛排店,這個牛排店叫...
    無敵小品子閱讀 511評論 0 6

友情鏈接更多精彩內(nèi)容