書名: Java核心技術·卷Ⅱ:高級特性(原書第10版)作者名: (美)凱S.霍斯特曼本章字數: 1111字更新時間: 2020-10-30 18:10:46
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
釋放這個鎖。
- Mastering RabbitMQ
- Apache Spark 2.x Machine Learning Cookbook
- 看透JavaScript:原理、方法與實踐
- Java程序設計與實踐教程(第2版)
- Learning Laravel 4 Application Development
- 微信公眾平臺開發:從零基礎到ThinkPHP5高性能框架實踐
- MATLAB定量決策五大類問題
- HTML5+CSS3網站設計基礎教程
- Python機器學習基礎教程
- Learning Node.js for .NET Developers
- 零基礎看圖學ScratchJr:少兒趣味編程(全彩大字版)
- Flask Web開發:基于Python的Web應用開發實戰(第2版)
- C++ System Programming Cookbook
- Python第三方庫開發應用實戰
- 虛擬現實建模與編程(SketchUp+OSG開發技術)