设为首页 加入收藏

TOP

文件加锁(基于FileChannel)
2014-11-23 19:52:59 来源: 作者: 【 】 浏览:30
Tags:文件 加锁 基于 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决定。第三个参数指定是否是共享锁



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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java代码调用Shell脚本并传入参数.. 下一篇输入流InputStream的reset()和mar..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: