NIO揭秘-4


File Locking
最初は「ファイルをロックする」というのはちょっと迷ったようです.プログラムやユーザーを組織して特定のファイルにアクセスすることを指しているようです.しかし、実際には、ファイルロックは普通のjavaオブジェクトのロックと同じように、データへのアクセスを阻止することはありません.逆に、共有ロックを通じて異なる部分のシステム協調を許可します.
一部のファイルをロックしたり、すべてのファイルをロックしたりすることができます.排他ロックを取得した場合、他のすべての人はこのファイルの同じ部分でロックを取得できません.共有ロックを取得した場合、他の人は共有ロックを取得することができますが、排他ロックを取得することはできません.ファイルロックは、データを保護するためにのみ使用されるわけではありません.たとえば、特定の書き込み操作が原子的であり、他のプロセスに干渉されないことを保証するために、ファイルを一時的にロックすることができます.
ほとんどのオペレーティングシステムではファイルロックが提供されていますが、方法は異なります.共有ロックを提供するものもあれば、排他ロックだけを提供するものもあれば、提供するものもあります.実際には、ほとんどの場合、必要ありませんが、一部のファイルをロックすることは難しいです.
    Locking a file
ファイル部分ロックを取得するには、FileChannelを開いた後にlock()メソッドを呼び出すことができます.排他ロックを取得したい場合は、書き込みでファイルを開く必要があります.
RandomAccsessFile raf = new RandomAccessFile( "usefilelocks.txt" ," rw " );
FileChannel fc = raf.getChannel();
FileLock lock = fc.lock( start,end,false );

ロックを取得した後、必要な敏感な操作を実行して、ロックを解放することができます.
lock.release();

ロックを解除すると、他のプログラムは平等にロックを取得する機会があります.
file lockをよりよく理解するために、プログラムを作成します:UseFileLocks.JAvaでは、ファイルのロックを取得して3秒保持した後に解放され、別のインスタンスを同時に実行すると、別のプログラムがブロックされていることがわかります.
package com.nio.example;

import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

/**
 *       
 */
public class UseFileLocks {
	
	public static void main(String[] args) throws Exception {
		
		RandomAccessFile raf = new RandomAccessFile("./src/ex_txt", "rw");
		FileChannel fc = raf.getChannel();
		System.out.println( "       " );
		//FileLock lock = fc.lock(0,raf.length(),true);	//   ,         
		FileLock lock = fc.lock();	//   ,        
		System.out.println( "     " );
		Thread.sleep(5000);
		lock.release();
		System.out.println( "     " );
	}
	
}

ファイルロックとその移植性
ファイルロックは依存できない場合があります.特に、異なるオペレーティングシステムが異なるロックメカニズムを実現している場合、以下のアドバイスは、プログラムが安定していることを助けることができます.
  • 排他ロック
  • のみ使用
  • すべてのロックを可能と見なします(つまり、どうすればいいか保証されていませんが、できるだけどうすればいいかだけです).