JavaTM 2
Platform
Std. Ed. v1.4.0

java.nio.channels
クラス FileLock

java.lang.Object
  |
  +--java.nio.channels.FileLock

public abstract class FileLock
extends Object

ファイル領域上のロックを示すトークンです。

FileChannel クラスの lock メソッドや tryLock メソッドを使ってファイル上にロックを獲得すると、そのたびにファイルロックオブジェクトが作成されます。

ファイルロックオブジェクトは最初から有効であり、release メソッドの呼び出し、ロックの獲得に使用したチャネルのクローズ、Java 仮想マシンの終了などによって解放されるまで、その状態を保持します。ロックの有効性は、isValid メソッドを呼び出すことによって確認できます。

ファイルロックには「排他ロック」と「共有ロック」があります。共有ロックの場合、同時に実行されているその他のプログラムは、オーバーラップする排他ロックを獲得できません。オーバーラップする共有ロックであれば獲得可能です。一方、排他ロックの場合、どちらの種類のロックも獲得できません。ロックを解放すると、その他のプログラムによって獲得されるロックへの影響はなくなります。

排他ロックであるか共有ロックであるかは、isShared メソッドを呼び出すことで判断できます。共有ロックをサポートしないプラットフォームでは、共有ロック要求は自動的に排他ロック要求に変換されます。

単一の Java 仮想マシンによって特定のファイル上に保持されているロックは、オーバーラップしません。候補となるロックの範囲が既存のロックをオーバーラップするかどうかは、overlaps メソッドで確認できます。

ファイルロックオブジェクトは、ロックを保持しているファイル、ロックの種類と有効性、ロックされた領域の位置とサイズに関するファイルチャネル情報を記録します。時間の経過とともに変化するのは、ロックの有効性だけです。その他のロック状態は不変です。

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

ファイルロックオブジェクトは、複数の並行スレッドで安全に使用できます。

プラットフォームの依存性

このファイルロック API は、基本となるオペレーティングシステムのネイティブのロック機能に直接マッピングされます。このため、ファイルにアクセスできるあらゆるプログラムが、作成に使用された言語とは関係なく、このファイル上に保持されたロックを認識します。

ロックされた領域のコンテンツにその他のプログラムからアクセスできなくなるかどうかは、システムによって決まるため未指定です。ネイティブのファイルロックとして、「アドバイザリロック」しかサポートしないシステムもあります。こうしたシステムでは、データの完全性を保証するため、プログラムを使って既知のロックプロトコルを監視する必要があります。一方、ネイティブのファイルロックが「必須ロック」というシステムもあります。この場合、あるプログラムによってファイル領域がロックされているとき、その他のプログラムからロックを破ってアクセスすることはできません。このほか、ネイティブのファイルロックをアドバイザリロックにするか必須ロックにするかをファイル単位で選択できるシステムもあります。プラットフォーム間の動作の一貫性と正確性を確保するためには、この API の提供するロックをアドバイザリロックとして使用することを強くお勧めします。

システムによっては、ファイル領域上で必須ロックを獲得すると、その領域をメモリにマップできなくなる場合、または反対にメモリを領域にマップできなくなる場合があります。ロックとマッピングの両方を組み合わせて使用するプログラムでは、この組み合わせを確実に準備する必要があります。

システムによっては、チャネルをクローズすると、基本となるファイル上で Java 仮想マシンによって保持されていたロックが、そのチャネルから獲得したか同じファイル上でオープンしている別のチャネルから獲得したかに関係なく、すべて解除される場合があります。単一のプログラム内では、指定されたファイル上のすべてのロックを一意のチャネルで獲得することを強くお勧めします。

一部のネットワークファイルシステムでは、ロックされた領域がページ型で、基本となるハードウェアのページサイズの完全倍数である場合にかぎり、ファイルロックをメモリマップで使用することができます。また別のネットワークファイルシステムでは、特定の位より上 (通常 230 または 231) の領域上のファイルロックが実装されません。一般に、ネットワークファイルシステム上のファイルをロックするときは、細心の注意を払う必要があります。

導入されたバージョン:
1.4

コンストラクタの概要
protected FileLock(FileChannel channel, long position, long size, boolean shared)
          このクラスの新しいインスタンスを初期化します。
 
メソッドの概要
 FileChannel channel()
          このロックが保持されているファイルを持つファイルチャネルを返します。
 boolean isShared()
          このロックが共有ロックであるかどうかを判断します。
abstract  boolean isValid()
          このロックが有効であるかどうかを判断します。
 boolean overlaps(long position, long size)
          このロックが指定されたロック範囲をオーバーラップしているかどうかを判断します。
 long position()
          ファイル内のロックされた領域の最初のバイトの位置を返します。
abstract  void release()
          このロックを解除します。
 long size()
          ロックされた領域のサイズをバイトで返します。
 String toString()
          このロックの範囲、種類、有効性を説明する文字列を返します。
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

コンストラクタの詳細

FileLock

protected FileLock(FileChannel channel,
                   long position,
                   long size,
                   boolean shared)
このクラスの新しいインスタンスを初期化します。

パラメータ:
channel - このロックが保持されているファイルを持つファイルチャネル
position - ファイル内のロックされた領域の開始位置。負の値以外
size - ロック領域のサイズ。負の値以外。position + size の合計も負の値以外
shared - このロックが共有ロックの場合 true、排他ロックの場合 false
例外:
IllegalArgumentException - 上記のパラメータの前提条件が満たされていない場合
メソッドの詳細

channel

public final FileChannel channel()
このロックが保持されているファイルを持つファイルチャネルを返します。

戻り値:
ファイルチャネル

position

public final long position()
ファイル内のロックされた領域の最初のバイトの位置を返します。

ロックされた領域が基本となるファイルに含まれている必要はありません。また、基本となるファイルをオーバーラップしている必要もありません。このメソッドは、現在のファイルサイズ以上の値を返すことがあります。

戻り値:
位置

size

public final long size()
ロックされた領域のサイズをバイトで返します。

ロックされた領域が基本となるファイルに含まれている必要はありません。また、基本となるファイルをオーバーラップしている必要もありません。このメソッドは、現在のファイルサイズ以上の値を返すことがあります。

戻り値:
ロックされた領域のサイズ

isShared

public final boolean isShared()
このロックが共有ロックであるかどうかを判断します。

戻り値:
共有ロックの場合 true、排他ロックの場合 false

overlaps

public final boolean overlaps(long position,
                              long size)
このロックが指定されたロック範囲をオーバーラップしているかどうかを判断します。

戻り値:
このロックと指定されたロック範囲が 1 バイト以上オーバーラップしている場合にかぎり true

isValid

public abstract boolean isValid()
このロックが有効であるかどうかを判断します。

ロックオブジェクトは、ロックが解放されるか、関連したファイルチャネルがクローズされるまで有効です。

戻り値:
このロックが有効である場合にかぎり true

release

public abstract void release()
                      throws IOException
このロックを解除します。

このメソッドを呼び出すと、ロックオブジェクトが有効ならロックが解除され、無効になります。ロックオブジェクトが無効なら変化はありません。

例外:
ClosedChannelException - このロックの獲得に使用したチャネルがオープンしていない場合
IOException - 入出力エラーが発生した場合

toString

public final String toString()
このロックの範囲、種類、有効性を説明する文字列を返します。

オーバーライド:
クラス Object 内の toString
戻り値:
説明文字列

JavaTM 2
Platform
Std. Ed. v1.4.0

バグの報告と機能のリクエスト
これ以外の API リファレンスおよび開発者用ドキュメントについては、 Java 2 SDK SE 開発者用ドキュメントを参照してください。 開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、 およびコード実例が含まれています。

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.