文件加锁(基于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决定。第三个参数指定是否是共享锁


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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/b04a97f10923e41f74bf29436a5763a7.html