9

そこで、以下を使用してファイルにロックを作成し、ファイルを排他的に編集できるようにしました。

 File file = new File(filename);
 channel = new RandomAccessFile(file, "rw").getChannel();
 lock = channel.tryLock();

これで、2番目のスレッドが同じファイルにアクセスしたいのですが、編集するのではなく、読むだけです。それ、どうやったら出来るの?現在、2番目のスレッドはio例外をスローし、ファイルがロックされていることを通知します。

これは実行可能ですか?助言がありますか?ありがとう

4

3 に答える 3

4

tryLockの3つの引数バージョンを使用して、共有ロックを要求してみることができます。

適切なjavadocは次のとおりです。http: //download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/FileChannel.html#tryLock%28long,%20long,%20boolean%29

基本的にあなたがする代わりに lock=channel.tryLock() あなたはするでしょうlock = channel.trylock(0, Long.MAX_VALUE, true)

余談ですが、Javaでのファイルロックには注意が必要です。ロックがJVM内で期待どおりに動作することを保証することはできますが、複数のプロセスにわたってロックが期待どおりに動作することを必ずしも保証することはできません。

于 2011-04-15T18:18:03.070 に答える
1

通常、ファイルのロックはオペレーティングシステムに基づいており、書き込みロックを取得すると、ファイルを取得するスレッドによって排他的になります。ただし、スレッド間でファイルオブジェクトを共有することもできます(ただし、競合状態に注意してください)。ファイルロック

于 2011-04-15T18:00:47.180 に答える
1

多分これは役に立ちます!

public abstract FileLock tryLock(long position,
                                 long size,
                                 boolean shared)
                         throws IOException

このチャネルのファイルの特定の領域でロックを取得しようとします。

このメソッドはブロックしません。呼び出しは、要求されたリージョンのロックを取得したか、ロックを取得できなかったかのいずれかで、常にすぐに戻ります。重複するロックが別のプログラムによって保持されているためにロックの取得に失敗した場合、nullを返します。その他の理由でロックの取得に失敗した場合は、適切な例外がスローされます。

位置とサイズのパラメーターで指定された領域は、実際の基になるファイル内に含まれている必要はなく、重複している必要もありません。ロック領域のサイズは固定されています。ロックされた領域に最初にファイルの終わりが含まれていて、ファイルがその領域を超えて大きくなる場合、ファイルの新しい部分はロックの対象になりません。ファイルのサイズが大きくなることが予想され、ファイル全体をロックする必要がある場合は、ゼロから始まり、ファイルの予想される最大サイズ以上の領域をロックする必要があります。引数なしのtryLock() 方法は、サイズの領域をロックするだけです Long.MAX_VALUE

一部のオペレーティングシステムは共有ロックをサポートしていません。その場合、共有ロックの要求は自動的に排他ロックの要求に変換されます。新しく取得したロックが共有されているか排他的であるかは、結果のロックオブジェクトのisSharedメソッドを呼び出すことによってテストできます。

ファイルロックは、Java仮想マシン全体に代わって保持されます。同じ仮想マシン内の複数のスレッドによるファイルへのアクセスを制御するのには適していません。

パラメータ:position-ロックされた領域が開始する位置。負でないサイズである必要があります-ロックされた領域のサイズ。非負である必要があり、合計位置+サイズは非負である必要があります共有-共有ロックを要求する場合はtrue、排他ロックを要求する場合はfalse戻り値:新しく取得したロックを表すロックオブジェクト、またはロックが可能である場合はnull別のプログラムが重複するロックを保持しているため、取得されませんスロー: IllegalArgumentException-パラメータの前提条件が保持されない ClosedChannelException場合-このチャネルが閉じている場合 OverlappingFileLockException-要求された領域と重複するロックがこのJava仮想マシンによってすでに保持されている場合、またはこのメソッドで別のスレッドがすでにブロックされており、同じファイルの重複領域をロックしようとしている IOException場合-他のI/Oエラーが発生した場合を参照してください。また :lock()、、lock(long,long,boolean)tryLock()

于 2011-04-15T18:04:24.197 に答える