FileLock,文件锁。
文件锁在OS中很常见,如果多个程序同时访问、修改同一个文件,很容易因为文件数据不同步而出现问题。给文件加一个锁,同一时间,只能有一个程序修改此文件,或者程序都只能读此文件,这就解决了同步问题,保证了线程安全。
文件锁是进程级别的,不是线程级别的。文件锁可以解决多个进程并发访问、修改同一个文件的问题,但不能解决多线程并发访问、修改同一文件的问题。
就是说使用文件锁时,同一进程内(同一个程序中)的多个线程,可以同时访问、修改此文件。
文件锁是当前程序所属的JVM实例持有的,一旦获取到文件锁(对文件加锁),要调用release(),或者关闭对应的FileChannel对象,或者当前JVM退出,才会释放这个锁。
一旦某个进程(比如说JVM实例)对某个文件加锁,则在释放这个锁之前,此进程不能再对此文件加锁,就是说JVM实例在同一文件上的文件锁是不重叠的(进程级别不能重复在同一文件上获取锁)。
文件锁分为2类:
使用示例:
1 //创建FileChannel对象,文件锁只能通过FileChannel对象来使用 2 FileChannel fileChannel=new FileOutputStream("./1.txt").getChannel(); 3 4 //对文件加锁 5 FileLock lock=fileChannel.lock(); 6 7 //对此文件进行一些读写操作。 8 //....... 9 10 //释放锁 11 lock.release();
文件锁要通过FileChannel对象使用。
有4种获取文件锁的方法:
如果指定为共享锁,则其它进程可读此文件,所有进程均不能写此文件,如果某进程试图对此文件进行写操作,会抛出异常。
lock与tryLock的区别:
FileLock常用的2个方法:
boolean isShared() //此文件锁是否是共享锁
boolean isValid() //此文件锁是否还有效
说明:在某些OS上,对某个文件加锁后,不能对此文件使用通道映射。
原文:https://www.cnblogs.com/chy18883701161/p/10940390.html