FileLock,文件锁
FileLock 是基于进程级别的,不是针对于线程级别的,因此文件锁对象可以安全地被多个并发线程使用。
文件锁分为2类:
1. 独占锁(排它锁)
进程对文件加独占锁后,当前进程对文件可读可写,独占此文件,其它进程是不能读该文件进行读写操作的,直至该进程释放文件锁release()。独占锁可防止其他程序获取任一类型的重叠锁。 一旦释放,锁对其他程序可能获得的锁不起任何影响。
2. 共享锁
进程多文件加共享锁后,其它进程也可以对文件进行读操作,对于这些进程而言,也只是进行读操作,无法向文件内部写入数据,是基于进程级别安全的(线程无效)。共享锁可防止其他并发运行的程序获取重叠的独占锁,但是允许它们获取重叠的共享锁。(注意:共享锁添加之后,所有进程只能读,不能写,直至该进程释放锁)
文件处于共享锁状态,是无法写入的。
锁是独占还是共享可以通过调用其isShared()方法来确定。某些平台不支持共享锁,在这种情况下,共享锁的请求将自动转换为独占锁的请求。文件锁对象可以安全地被多个并发线程使用。
lock() //对整个文件加锁,默认为排它锁
lock(long position, long size, boolean shared) //自定义加锁方式。前2个参数指定要加锁的部分(可以只对文件的部分内容加锁),第三个参数值是 是否是共享锁。
tryLock() //对整个文件加锁,默认为排它锁
tryLock(long position, long size, boolean shared) //自定义加锁方式。如果指定为共享锁,则其它进程可读此文件,所有进程均不能写此文件,如果某一进程试图对此文件进行写操作,会抛出异常。
lock() 与 tryLock() 区别在于 ,tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回null,不会阻塞当前线程。lock()基于阻塞的,拿不到锁会一直阻塞当前线程直至获取文件锁。