FileLock,文件锁。安全
文件锁在OS中很常见,若是多个程序同时访问、修改同一个文件,很容易由于文件数据不一样步而出现问题。给文件加一个锁,同一时间,只能有一个程序修改此文件,或者程序都只能读此文件,这就解决了同步问题,保证了线程安全。多线程
文件锁是进程级别的,不是线程级别的。文件锁能够解决多个进程并发访问、修改同一个文件的问题,但不能解决多线程并发访问、修改同一文件的问题。并发
就是说使用文件锁时,同一进程内(同一个程序中)的多个线程,能够同时访问、修改此文件。spa
文件锁是当前程序所属的JVM实例持有的,一旦获取到文件锁(对文件加锁),要调用release(),或者关闭对应的FileChannel对象,或者当前JVM退出,才会释放这个锁。线程
一旦某个进程(好比说JVM实例)对某个文件加锁,则在释放这个锁以前,此进程不能再对此文件加锁,就是说JVM实例在同一文件上的文件锁是不重叠的(进程级别不能重复在同一文件上获取锁)。code
文件锁分为2类:对象
使用示例:blog
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上,对某个文件加锁后,不能对此文件使用通道映射。
如何避免死锁:在读写关键数据时加锁,操做完成后解锁;一次性申请全部须要的资源,而且在申请不成功的状况下放弃已申请到的资源。