作者:Flyingis
文件加鎖是JDK1.4引入的一種機制,它允許我們同步訪問某個作為共享資源的文件。競爭同一文件的兩個線程可能在不同的Java虛擬機上,或者一個是Java線程,另一個是操作系統(tǒng)中的某個本地線程。文件鎖對其他的操作系統(tǒng)進(jìn)程是可見的,因為Java的文件加鎖直接映射到了本地操作系統(tǒng)的加鎖工具。
通過對FileChannel調(diào)用tryLock()或lock(),就可以獲得整個文件的FileLock。特殊的是,SocketChannel/DatagramChannel/ServerSocketChannel不需要加鎖,因為它們是從單進(jìn)程實體繼承而來,我們通常不在兩個進(jìn)程之間共享網(wǎng)絡(luò)的socket。
tryLock()是非阻塞式的,它設(shè)法獲取鎖,但如果不能獲得,例如因為其他一些進(jìn)程已經(jīng)持有相同的鎖,而且不共享時,它將直接從方法調(diào)用返回。
lock()是阻塞式的,它要阻塞進(jìn)程直到鎖可以獲得,或調(diào)用lock()的線程中斷,或調(diào)用lock()的通道關(guān)閉。
對獨占鎖和共享鎖的支持必須由底層的操作系統(tǒng)提供。鎖的類型可以通過FileLock.isShared()進(jìn)行查詢。另外,我們不能獲取緩沖器上的鎖,只能是通道上的。
文件加鎖的實際應(yīng)用之一:文件映射通常應(yīng)用于大型的文件,我們可能需要對巨大的文件進(jìn)行部分加鎖,以便其他的進(jìn)程可以修改文件中未被加鎖的部分,數(shù)據(jù)庫就是如此,使得多用戶可以訪問到未加鎖的部分?jǐn)?shù)據(jù)。其他的應(yīng)用還知之甚少。