文件加锁(基于FileChannel)

      JDK1.4引入了文件加锁机制。它允许我们同步访问某个作为共享资源的文件。不过,竞争同一文件的两个线程可能在不同的Java虚拟机上,或者一个是Java线程,另一个是操作系统中的其他的某个本地线程。文件加锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的枷锁工具。

      通过对FileChannel调用tryLock()或者lock(),就可以获得整个文件的FileLock。其中tryLock()是非阻塞式的,它设法获得锁,如果不能获得(其他的一些进程已经持有相同的锁,并且不共享),它将直接从方法调用返回。lock()则是阻塞式的,它要阻塞进程直至锁可以获得,或者调用lock()的线程中断(就是自己先挂掉了),或调用lock()的通道关闭。使用FileLock.release()可以释放锁。

FileOutputStream fos = new FileOutputStream(new File("lock.tct"));
FileLock fl = fos.getChannel().tryLock();
if(fl!=null) {
    XXXX//各种文件操作
    fl.release(); //释放锁
}
fos.close();

       也可以通过如下方法对文件的一部分上锁

 tryLock(long pos , long size , boolean shared) 
 lock(long pos , long size , boolean shared) 
//加锁的区域由size-position决定。第三个参数指定是否是共享锁

        无参数的加锁方法将根据文件尺寸的变化而变化,而固定尺寸的锁不随文件尺寸的变化而变化。如果你在某一区域上加锁了,那么当文件增大的时候,加锁区域还是那个区域,多出的区域不会被锁定。而无参数的时候,是对整个文件进行加锁,文件变大后,也是对整个文件进行加锁。

 

posted @ 2013-03-31 21:15  chenfei0801  阅读(2697)  评论(0编辑  收藏  举报