`

文件加锁(基于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.linuxidc.com/Linux/2014-10/107586.htm

      http://blog.csdn.net/hbcui1984/article/details/1440226
     
      http://hbcui1984.iteye.com/blog/38524
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics