モジュール java.base
パッケージ java.nio.channels

クラスFileLock

java.lang.Object
java.nio.channels.FileLock
すべての実装されたインタフェース:
AutoCloseable

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)の領域上のファイル・ロックが実装されません。 一般に、ネットワーク・ファイル・システム上のファイルをロックするときは、細心の注意を払う必要があります。

導入されたバージョン:
1.4
  • コンストラクタのサマリー

    コンストラクタ
    修飾子 コンストラクタ 説明
    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()
    このロックの範囲、種類、有効性を説明する文字列を返します。

    クラス 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 - 上記のパラメータの前提条件が満たされていない場合
    • 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()
      ロックされた領域のサイズをバイトで返します。

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

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

      public final boolean isShared()
      このロックが共有ロックであるかどうかを判断します。
      戻り値:
      共有ロックの場合true、排他ロックの場合false
    • overlaps

      public final boolean overlaps​(long position, long size)
      このロックが指定されたロック範囲とオーバーラップしているかどうかを判断します。
      パラメータ:
      position - ロック範囲の開始位置
      size - ロック範囲のサイズ
      戻り値:
      このロックと指定されたロック範囲が1バイト以上オーバーラップしている場合にかぎりtrue
    • 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

      public final String toString()
      このロックの範囲、種類、有効性を説明する文字列を返します。
      オーバーライド:
      toString 、クラス:  Object
      戻り値:
      説明文字列