JavaTM Platform
Standard Ed. 6

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 Platform
Standard Ed. 6

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

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。