官术网_书友最值得收藏!

2.6.3 文件加鎖機制

考慮一下多個同時執行的程序需要修改同一個文件的情形,很明顯,這些程序需要以某種方式進行通信,不然這個文件很容易被損壞。文件鎖可以解決這個問題,它可以控制對文件或文件中某個范圍的字節的訪問。

假設你的應用程序將用戶的偏好存儲在一個配置文件中,當用戶調用這個應用的兩個實例時,這兩個實例就有可能會同時希望寫這個配置文件。在這種情況下,第一個實例應該鎖定這個文件,當第二個實例發現這個文件被鎖定時,它必須決策是等待直至這個文件解鎖,還是直接跳過這個寫操作過程。

要鎖定一個文件,可以調用FileChannel類的lock或tryLock方法:

第一個調用會阻塞直至可獲得鎖,而第二個調用將立即返回,要么返回鎖,要么在鎖不可獲得的情況下返回null。這個文件將保持鎖定狀態,直至這個通道關閉,或者在鎖上調用了release方法。

你還可以通過下面的調用鎖定文件的一部分:

如果shared標志為false,則鎖定文件的目的是讀寫,而如果為true,則這是一個共享鎖,它允許多個進程從文件中讀入,并阻止任何進程獲得獨占的鎖。并非所有的操作系統都支持共享鎖,因此你可能會在請求共享鎖的時候得到的是獨占的鎖。調用FileLock類的isShared方法可以查詢你所持有的鎖的類型。

注意:如果你鎖定了文件的尾部,而這個文件的長度隨后增長超過了鎖定的部分,那么增長出來的額外區域是未鎖定的,要想鎖定所有的字節,可以使用Long.MAX_VALUE來表示尺寸。

要確保在操作完成時釋放鎖,與往常一樣,最好在一個try語句中執行釋放鎖的操作:

請記住,文件加鎖機制是依賴于操作系統的,下面是需要注意的幾點:

·在某些系統中,文件加鎖僅僅是建議性的,如果一個應用未能得到鎖,它仍舊可以向被另一個應用并發鎖定的文件執行寫操作。

·在某些系統中,不能在鎖定一個文件的同時將其映射到內存中。

·文件鎖是由整個Java虛擬機持有的。如果有兩個程序是由同一個虛擬機啟動的(例如Applet和應用程序啟動器),那么它們不可能每一個都獲得一個在同一個文件上的鎖。當調用lock和tryLock方法時,如果虛擬機已經在同一個文件上持有了另一個重疊的鎖,那么這兩個方法將拋出OverlappingFileLockException。

·在一些系統中,關閉一個通道會釋放由Java虛擬機持有的底層文件上的所有鎖。因此,在同一個鎖定文件上應避免使用多個通道。

·在網絡文件系統上鎖定文件是高度依賴于系統的,因此應該盡量避免。

java.nio.channels.FileChannel 1.4

·FileLock lock()

在整個文件上獲得一個獨占的鎖,這個方法將阻塞直至獲得鎖。

·FileLock tryLock()

在整個文件上獲得一個獨占的鎖,或者在無法獲得鎖的情況下返回null。

·FileLock lock(long position,long size,boolean shared)

·FileLock tryLock(long position,long size,boolean shared)

在文件的一個區域上獲得鎖。第一個方法將阻塞直至獲得鎖,而第二個方法將在無法獲得鎖時返回null。

參數:position 要鎖定區域的起始位置

size 要鎖定區域的尺寸

shared true為共享鎖,false為獨占鎖

java.nio.channels.FileLock 1.4

·void close()1.7

釋放這個鎖。

主站蜘蛛池模板: 桂林市| 南安市| 旬邑县| 罗山县| 临清市| 上高县| 宁城县| 盱眙县| 嵊州市| 登封市| 张掖市| 渝北区| 丹阳市| 寿光市| 都安| 龙泉市| 富民县| 安远县| 澄迈县| 晋州市| 秦皇岛市| 富川| 建德市| 沭阳县| 当雄县| 武强县| 石家庄市| 岳普湖县| 女性| 江北区| 葫芦岛市| 滕州市| 文山县| 溧阳市| 田林县| 罗江县| 镇雄县| 杭锦后旗| 昌黎县| 麻栗坡县| 米易县|