[java] ファイルロック

  • ファイルロック

Lock ファイルを作成、削除することによって、ロックを管理する

①ファイルを操作する前に、createNewFile()でロックファイルを作成する。
  この時
   ・新規に作成できた=true
   ・すでにファイルが存在している場合=false
  か返ってくる。
②ファイル操作を行う
③ファイル操作が終了したら、finally 内で delete()を行う。

問題点:ロックファイル作成後で、削除するまでの間に、プログラムが落ちた場合。
    ロックファイルを削除する動作が働く前に落ちるとファイルロックが解除されないままになる。 

File lockFile = new File("pid.lock");
lockFile.deleteOnExit();

while (lockFile.createNewFile()) {
   try {
       // ロックを取得している場合の処理
       ...
   } finally {
       lockFile.delete();
   }
} else {
   throw new RuntimeException("ロックを取得できませんでした.");
}

FileLock オブジェクトを使用し、ロックを管理する

①ロック対象のファイルの FileChannel を取得し、.tryLock()でロックをかける。
  この時
   ・ロックをかけられる場合は、値
   ・ロックをかけられない場合は、null
  が返ってくる。
  ※ tryLock の JavaDoc
    オーバーラップしたロックが別のプログラムによって保持されていたためロックに失敗した場合、
    null が返されます。その他の原因でロックに失敗した場合は、適切な例外がスローされます。
② tryLock() 結果をもとに自分がロックを保有した場合、ファイル操作を行う。
③ファイル操作が終了したら、finally内でFileLock.release()を行う。

try {
   File lockFile = new File("pid.lock");
   lockFile.deleteOnExit();

   fs = new FileInputStream(lockFile);
   FileChannel fc = fs.getChannel();

   FileLock lock = fc.tryLock();

   if (lock == null) {
       new RuntimeException("ロック中");
   }

   try {
       // ロックを獲得している場合の処理
       ...
   } finally {
       // ロックの開放
       lock.release();
   }
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
} finally {
   try {
   	fs.close();
   } catch (IOException e) {
   	e.printStackTrace();
   }
}

追加情報
File.deleteOnExit()
 仮想マシンが終了したときに該当ファイルが削除される。
FileChannel.tryLock() (戻りの型 = FileLock)
 このチャネルのファイル上で排他ロックを獲得しようとする。
FileLock.release()
 このロックを解除します。

最終更新:2011年10月14日 10:47
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。