日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java NIO深入研究3】文件锁

發布時間:2023/11/30 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java NIO深入研究3】文件锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.1概述——文件鎖

?

文件鎖定初看起來可能讓人迷惑。它 似乎 指的是防止程序或者用戶訪問特定文件。事實上,文件鎖就像常規的?Java?對象鎖 — 它們是 勸告式的(advisory) 鎖。它們不阻止任何形式的數據訪問,相反,它們通過鎖的共享和獲取賴允許系統的不同部分相互協調。

?

您可以鎖定整個文件或者文件的一部分。如果您獲取一個排它鎖,那么其他人就不能獲得同一個文件或者文件的一部分上的鎖。如果您獲得一個共享鎖,那么其他人可以獲得同一個文件或者文件一部分上的共享鎖,但是不能獲得排它鎖。文件鎖定并不總是出于保護數據的目的。例如,您可能臨時鎖定一個文件以保證特定的寫操作成為原子的,而不會有其他程序的干擾。

?

大多數操作系統提供了文件系統鎖,但是它們并不都是采用同樣的方式。有些實現提供了共享鎖,而另一些僅提供了排它鎖。事實上,有些實現使得文件的鎖定部分不可訪問,盡管大多數實現不是這樣的。

?

在本節中,您將學習如何在?NIO?中執行簡單的文件鎖過程,我們還將探討一些保證被鎖定的文件盡可能可移植的方法。

?

1.2文件鎖定和可移植性

?

文件鎖定可能是一個復雜的操作,特別是考慮到不同的操作系統是以不同的方式實現鎖這一事實。下面的指導原則將幫助您盡可能保持代碼的可移植性:

只使用排它鎖。

將所有的鎖視為勸告式的(advisory)。

public class UseFileLocks {static private final int start = 10;static private final int end = 20;static public void main( String args[] ) throws Exception {new Thread(new Runnable() {public void run() {// Get file channelRandomAccessFile raf = null;try {raf = new RandomAccessFile( "usefilelocks.txt", "rw" );} catch (FileNotFoundException e) {// TODO Auto-generated catch block e.printStackTrace();}FileChannel fc = raf.getChannel();// Get lockSystem.out.println( "trying to get lock" );FileLock lock = null;try {lock = fc.lock( start, end, false );} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}System.out.println( "got lock!" );// PauseSystem.out.println( "pausing" );try { Thread.sleep( 5000 ); } catch( InterruptedException ie ) {}// Release lockSystem.out.println( "going to release lock" );try {lock.release();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}System.out.println( "released lock" );try {raf.close();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}}}).start();new Thread(new Runnable() {public void run() {// Get file channelRandomAccessFile raf = null;try {raf = new RandomAccessFile( "usefilelocks.txt", "rw" );} catch (FileNotFoundException e) {// TODO Auto-generated catch block e.printStackTrace();}FileChannel fc = raf.getChannel();// Get lockSystem.out.println( "trying to get lock" );FileLock lock = null;try {lock = fc.lock( start, end, false );} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}System.out.println( "got lock!" );// Release lockSystem.out.println( "going to release lock" );try {lock.release();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}System.out.println( "released lock" );try {raf.close();} catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace();}}}).start();}}

運行結果:

trying to get lock
trying to get lock
got lock!
going to release lock
released lock
Exception in thread "Thread-0" java.nio.channels.OverlappingFileLockException
at sun.nio.ch.SharedFileLockTable.checkList(Unknown Source)
at sun.nio.ch.SharedFileLockTable.add(Unknown Source)
at sun.nio.ch.FileChannelImpl.lock(Unknown Source)
at zhongqiu.common.base.nio.UseFileLocks$1.run(UseFileLocks.java:28)
at java.lang.Thread.run(Unknown Source)

轉載于:https://www.cnblogs.com/guweiwei/p/6527059.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【Java NIO深入研究3】文件锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。