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