public abstract class FileLock extends Object implements AutoCloseable
FileChannel
クラスの lock
メソッドまたは tryLock
メソッド、または AsynchronousFileChannel
クラスの lock
メソッドまたは tryLock
メソッドの 1 つを使用してファイル上にロックを獲得すると、そのたびにファイルロックオブジェクトが作成されます。
ファイルロックオブジェクトは最初から有効であり、release
メソッドの呼び出し、ロックの獲得に使用したチャネルのクローズ、Java 仮想マシンの終了などによってロックが解放されるまで、その状態を保持します。ロックの有効性は、isValid
メソッドを呼び出すことによってテストできます。
ファイルロックには排他ロックと共有ロックがあります。共有ロックの場合、並行して実行されているその他のプログラムは、オーバーラップする排他ロックを獲得できません。オーバーラップする共有ロックであれば獲得可能です。一方、排他ロックの場合、どちらの種類のロックも獲得できません。ロックを解放すると、その他のプログラムによって獲得されるロックへの影響はなくなります。
排他ロックであるか共有ロックであるかは、isShared
メソッドを呼び出すことで判断できます。共有ロックをサポートしないプラットフォームでは、共有ロック要求が自動的に排他ロック要求に変換されます。
単一の Java 仮想マシンによって特定のファイル上に保持されているロックは、オーバーラップしません。候補となるロックの範囲が既存のロックとオーバーラップするかどうかは、overlaps
メソッドでテストできます。
ファイルロックオブジェクトは、ロックを保持しているファイル、ロックの種類と有効性、ロックされた領域の位置とサイズに関するファイルチャネル情報を記録します。時間の経過とともに変化するのは、ロックの有効性だけです。その他のロック状態は不変です。
ファイルロックは Java 仮想マシン全体のために保持されます。これらは、同一仮想マシン内の複数スレッドによるファイルへのアクセスを制御するのには適していません。
ファイルロックオブジェクトは、複数の並行スレッドで安全に使用できます。
プラットフォームの依存性
このファイルロック API は、基礎にあるオペレーティングシステムのネイティブのロック機能に直接マッピングされます。このため、ファイルにアクセスできるあらゆるプログラムが、作成に使用された言語とは関係なく、このファイル上に保持されたロックを認識します。
ロックされた領域のコンテンツにその他のプログラムからアクセスできなくなるかどうかは、システムによって決まるため未指定です。ネイティブのファイルロックとして、アドバイザリロックしかサポートしないシステムもあります。こうしたシステムでは、データの整合性を保証するため、プログラムを使って既知のロックプロトコルを監視する必要があります。一方、ネイティブのファイルロックが必須ロックというシステムもあります。この場合、あるプログラムによってファイル領域がロックされているとき、その他のプログラムからロックを破ってその領域にアクセスすることはできません。このほか、ネイティブのファイルロックをアドバイザリロックにするか必須ロックにするかをファイル単位で選択できるシステムもあります。プラットフォーム間の動作の一貫性と正確性を確保するためには、この API の提供するロックをアドバイザリロックとして使用することを強くお勧めします。
システムによっては、ファイル領域上で必須ロックを獲得すると、そのファイル領域をメモリーにマッピング
できなくなったり、反対にメモリーをファイル領域にマッピングできなくなったりする場合があります。ロックとマッピングの両方を組み合わせて使用するプログラムでは、この組み合わせが失敗することに備えておく必要があります。
システムによっては、チャネルをクローズすると、基礎にあるファイル上で Java 仮想マシンによって保持されていたロックが、そのチャネルから獲得したか、または同じファイル上でオープンしている別のチャネルから獲得したかに関係なく、すべて解除される場合があります。単一のプログラム内では、ある特定のファイル上のすべてのロックを一意のチャネルで獲得することを強くお勧めします。
一部のネットワークファイルシステムでは、ロックされた領域がページ型で、基礎にあるハードウェアのページサイズの完全倍数である場合に限り、ファイルロックをメモリーマップで使用することができます。また別のネットワークファイルシステムでは、特定の位より上 (通常 230 または 231) の領域上のファイルロックが実装されません。一般に、ネットワークファイルシステム上のファイルをロックするときは、細心の注意を払う必要があります。
修飾子 | コンストラクタと説明 |
---|---|
protected |
FileLock(AsynchronousFileChannel channel, long position, long size, boolean shared)
このクラスの新しいインスタンスを初期化します。
|
protected |
FileLock(FileChannel channel, long position, long size, boolean shared)
このクラスの新しいインスタンスを初期化します。
|
修飾子と型 | メソッドと説明 |
---|---|
Channel |
acquiredBy()
このロックが獲得されたファイルを持つチャネルを返します。
|
FileChannel |
channel()
このロックが獲得されたファイルを持つファイルチャネルを返します。
|
void |
close()
このメソッドは、
release() メソッドを呼び出します。 |
boolean |
isShared()
このロックが共有ロックであるかどうかを判断します。
|
abstract boolean |
isValid()
このロックが有効であるかどうかを判断します。
|
boolean |
overlaps(long position, long size)
このロックが指定されたロック範囲とオーバーラップしているかどうかを判断します。
|
long |
position()
ファイル内のロックされた領域の最初のバイトの位置を返します。
|
abstract void |
release()
このロックを解除します。
|
long |
size()
ロックされた領域のサイズをバイトで返します。
|
String |
toString()
このロックの範囲、種類、有効性を説明する文字列を返します。
|
protected FileLock(FileChannel channel, long position, long size, boolean shared)
channel
- このロックが保持されているファイルを持つファイルチャネルposition
- ファイル内の、ロックされた領域の開始位置。負でない値である必要がありますsize
- ロック領域のサイズ。負でない値である必要があります。position + size も負でない値である必要がありますshared
- このロックが共有ロックの場合 true、排他ロックの場合 falseIllegalArgumentException
- 上記のパラメータの前提条件が満たされていない場合protected FileLock(AsynchronousFileChannel channel, long position, long size, boolean shared)
channel
- このロックが保持されているファイルを持つチャネルposition
- ファイル内の、ロックされた領域の開始位置。負でない値である必要がありますsize
- ロック領域のサイズ。負でない値である必要があります。position + size も負でない値である必要がありますshared
- このロックが共有ロックの場合 true、排他ロックの場合 falseIllegalArgumentException
- 上記のパラメータの前提条件が満たされていない場合public final FileChannel channel()
このメソッドは acquiredBy
メソッドにとって代わりました。
null
。public Channel acquiredBy()
public final long position()
ロックされた領域が基礎にあるファイルに含まれていたり、オーバーラップしたりしている必要はありません。このメソッドは、現在のファイルサイズ以上の値を返すことがあります。
public final long size()
ロックされた領域が基礎にあるファイルに含まれていたり、オーバーラップしたりしている必要はありません。このメソッドは、現在のファイルサイズ以上の値を返すことがあります。
public final boolean isShared()
public final boolean overlaps(long position, long size)
public abstract boolean isValid()
ロックオブジェクトは、ロックが解放されるか、関連したファイルチャネルがクローズされるまで有効です。
public abstract void release() throws IOException
このメソッドを呼び出すと、ロックオブジェクトが有効ならロックが解除され、無効になります。ロックオブジェクトが無効なら変化はありません。
ClosedChannelException
- このロックの獲得に使用したチャネルがオープンしていない場合IOException
- 入出力エラーが発生した場合public final void close() throws IOException
release()
メソッドを呼び出します。これは、自動リソース管理ブロック構文とともに使用できるように、クラスに追加されました。close
、インタフェース: AutoCloseable
IOException
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.