引言
在通道中我们可以对文件或者部分文件进行上锁。上锁和我们了解的线程锁差不多,都是为了保证数据的一致性。在文件通道FileChannel中可以对文件进行上锁,通过FileLock可以对文件进行锁的释放。在本篇博文中会详细介绍在NIO中对文件锁的操作与配置,同时给出对应demo。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接:http://blog.csdn.net/u012403290
文件通道FileChannel
文件加锁是建立在文件通道(FileChannel)之上的,套接字通道(SockeChannel)不考虑文件加锁,因为它是不共享的。它对文件加锁有两种方式:
①lock
public final FileLock lock() throws IOException {
return lock(0L, Long.MAX_VALUE, false);
}
public abstract FileLock lock(long position, long size, boolean shared)
throws IOException;
②tryLock
public final FileLock tryLock() throws IOException {
return tryLock(0L, Long.MAX_VALUE, false);
}
public abstract FileLock tryLock(long position, long size, boolean shared)
throws IOException;
两种加锁方式默认都是对整个文件加锁,如果自己配置的话就可以控制加锁的文件范围:position是加锁的开始位置,size是加锁长度,shared是用于控制该锁是共享的还是独占的。
那么两个到底有什么区别呢?
lock是阻塞式的,当有进程对锁进行读取时会等待锁的释放,在此期间它会一直等待;tryLock是非阻塞式的,它尝试获得锁,如果这个锁不能获得,那么它会立即返回。
其实,这个锁的机制有点像多线程中的Lock锁,可以参考以前博文,其中有对synchronized与lock的比较(http://blog.csdn.net/u012403290/article/details/64910926)
下面这段代码区别了这个其中的关系:
package com.brickworkers.io.nio;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.channels.FileLock;
/**
*
* @author Brickworker
* Date:2017年5月22日下午3:06:55
* 关于类LockingTest.java的描述:NIO文件加锁
* Copyright (c) 2017, brcikworker All Rights Reserved.
*/
public class LockingTest {
private static class MyThread extends Thread{
private FileOutputStream fs;
private boolean isTrylock;
public MyThread(FileOutputStream fs, boolean isTrylock) {
this.fs = fs;
this.isTrylock = isTrylock;
}
@Override
public void run() {
try {
//获取锁
FileLock fl;
if(isTrylock){
fl &#