FileLock是java 1.4 版本后出现的一个类,它可以通过对一个可写文件(w)加锁,保证同时只有一个进程可以拿到文件的锁,这个进程从而可以对文件做访问;而其它拿不到锁的进程要么选择被挂起等待,要么选择去做一些其它的事情, 这样的机制保证了众进程可以顺序访问该文件。也可以看出,能够利用文件锁的这种性质,在一些场景下,虽然我们不需要操作某个文件, 但也可以通过 FileLock 来进行并发控制,保证进程的顺序执行,避免数据错误。
通过 NIO 的 API 首先获取文件的 FileChannel ,然后可以通过 FileChannel 以下4中方式获取FileLock。
public final FileLock lock() throws IOException {
return lock(0L, Long.MAX_VALUE, false);
}
默认锁定整个文件,并设置为独占锁。
public FileLock lock(long position, long size, boolean shared) throws IOException{
......
}
一些不支持共享锁的操作系统,将自动将共享锁改成排它锁。可以通过调用isShared()方法来检测获得的是什么类型的锁。
public final FileLock tryLock() throws IOException {
return tryLock(0L, Long.MAX_VALUE, false);
}
如果获取不到锁,则返回null。而不阻塞当前线程,等待获取锁。
public abstract FileLock tryLock(long position, long size, boolean shared) throws IOException{
......
}
参数同上2。 如果获取不到锁,则返回null。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class FileLockTest {
public static void main(String[] args){
FileLock lock = null;
try (FileChannel channel = new FileOutputStream("d:\\file.lock",true).getChannel()){
lock = channel.lock();//无参lock()为独占锁
//lock = channel.lock(0L, channel.size(), true); //共享锁
//其它逻辑
......
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (lock != null) {
try {
lock.release();
lock = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}