由于是做分布式的中间件开发,不可避免会出现多个线程对同一个文件进行操作,这样会出现很多问题。如果多个线程同时对一个文件进行写操作,会乱掉。所以我们需要对文件进行加锁,使其每次只能被一个线程操作。这样才能保证文件中的内容可以被有序的写入。
文件锁分为共享锁,和排他锁,通过字节流获得通道来实现,进行相应的互斥访问或排它访问。
共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排它锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
tryLock():获取文件排它锁,进行对文件的排它操作。
tryLock(position,filelength(),true):获取文件锁模式,并指定文件锁,true:共享锁,false:排它锁。
relase():释放文件锁
下面就来看看如何在写入文件中加入文件锁:
public static void writeFile(File file, String data) {
FileLock fl = null;
FileOutputStream fos = null;
FileChannel fc = null;
try {
fos = new FileOutputStream(file, true);// 可续写
fc = fos.getChannel();
fl = fc.tryLock();// 加锁
fos.write((data + "\r\n").getBytes());// 写入内容,加换行符
fos.flush();// 刷新
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fl.release();// 解锁
if (fos != null) {
fos.close();// 释放对象
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
当文件使用try lock()加锁之后,其他线程无法进行读写操作。直到调用release()之后才可以正常访问。
这就是文件锁的基本使用。
喜欢的朋友点个赞哦~~