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與tryLock的區別:
FileLock經常使用的2個方法:
boolean isShared() //此文件鎖是不是共享鎖
boolean isValid() //此文件鎖是否還有效
在某些OS上,對某個文件加鎖後,不能對此文件使用通道映射。
如何避免死鎖:在讀寫關鍵數據時加鎖,操做完成後解鎖;一次性申請全部須要的資源,而且在申請不成功的狀況下放棄已申請到的資源。