Java NIO中的FileLock(文件鎖)

 

FileLock,文件鎖。安全

文件鎖在OS中很常見,若是多個程序同時訪問、修改同一個文件,很容易由於文件數據不一樣步而出現問題。給文件加一個鎖,同一時間,只能有一個程序修改此文件,或者程序都只能讀此文件,這就解決了同步問題,保證了線程安全。多線程

 

 

 

文件鎖是進程級別的,不是線程級別的。文件鎖能夠解決多個進程併發訪問、修改同一個文件的問題,但不能解決多線程併發訪問、修改同一文件的問題。併發

就是說使用文件鎖時,同一進程內(同一個程序中)的多個線程,能夠同時訪問、修改此文件。spa

 

文件鎖是當前程序所屬的JVM實例持有的,一旦獲取到文件鎖(對文件加鎖),要調用release(),或者關閉對應的FileChannel對象,或者當前JVM退出,纔會釋放這個鎖。線程

 

一旦某個進程(好比說JVM實例)對某個文件加鎖,則在釋放這個鎖以前,此進程不能再對此文件加鎖,就是說JVM實例在同一文件上的文件鎖是不重疊的(進程級別不能重複在同一文件上獲取鎖)。code

 

 

 

文件鎖分爲2類:對象

  • 排它鎖:又叫獨佔鎖。對文件加排它鎖後,該進程能夠對此文件進行讀寫,該進程獨佔此文件,其餘進程不能讀寫此文件,直到該進程釋放文件鎖。
  • 共享鎖:某個進程對文件加共享鎖,其餘進程也能夠訪問此文件,但這些進程都只能讀此文件,不能寫。線程是安全的。只要還有一個進程持有共享鎖,此文件就只能讀,不能寫。

 

 

 

使用示例:blog

 1  //建立FileChannel對象,文件鎖只能經過FileChannel對象來使用
 2         FileChannel fileChannel=new FileOutputStream("./1.txt").getChannel();
 3 
 4         //對文件加鎖
 5         FileLock lock=fileChannel.lock();
 6 
 7         //對此文件進行一些讀寫操做。
 8         //.......
 9 
10         //釋放鎖
11         lock.release();

 

 

 

文件鎖要經過FileChannel對象使用。進程

有4種獲取文件鎖的方法:資源

  • lock()    //對整個文件加鎖,默認爲排它鎖。
  • lock(long position, long size, booean  shared)    //自定義加鎖方式。前2個參數指定要加鎖的部分(能夠只對此文件的部份內容加鎖),第三個參數值指定是不是共享鎖。
  • tryLock()    //對整個文件加鎖,默認爲排它鎖。
  • tryLock(long position, long size, booean  shared)     //自定義加鎖方式。

若是指定爲共享鎖,則其它進程可讀此文件,全部進程均不能寫此文件,若是某進程試圖對此文件進行寫操做,會拋出異常。

 

lock與tryLock的區別:

  • lock是阻塞式的,若是未獲取到文件鎖,會一直阻塞當前線程,直到獲取文件鎖
  • tryLock和lock的做用相同,只不過tryLock是非阻塞式的,tryLock是嘗試獲取文件鎖,獲取成功就返回鎖對象,不然返回null,不會阻塞當前線程。

 

 

FileLock經常使用的2個方法:

boolean  isShared()     //此文件鎖是不是共享鎖

boolean  isValid()    //此文件鎖是否還有效

 

 

 

在某些OS上,對某個文件加鎖後,不能對此文件使用通道映射。

 

如何避免死鎖:在讀寫關鍵數據時加鎖,操做完成後解鎖;一次性申請全部須要的資源,而且在申請不成功的狀況下放棄已申請到的資源。

相關文章
相關標籤/搜索