作者:Flyingis
文件加锁是JDK1.4引入的一种机制,它允许我们同步访问某个作为共享资源的文件。竞争同一文件的两个线程可能在不同的Java虚拟机上,或者一个是Java线程,另一个是操作系统中的某个本地线程。文件锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的加锁工具。
通过对FileChannel调用tryLock()或lock(),就可以获得整个文件的FileLock。特殊的是,SocketChannel/DatagramChannel/ServerSocketChannel不需要加锁,因为它们是从单进程实体继承而来,我们通常不在两个进程之间共享网络的socket。
tryLock()是非阻塞式的,它设法获取锁,但如果不能获得,例如因为其他一些进程已经持有相同的锁,而且不共享时,它将直接从方法调用返回。
lock()是阻塞式的,它要阻塞进程直到锁可以获得,或调用lock()的线程中断,或调用lock()的通道关闭。
对独占锁和共享锁的支持必须由底层的操作系统提供。锁的类型可以通过FileLock.isShared()进行查询。另外,我们不能获取缓冲器上的锁,只能是通道上的。
文件加锁的实际应用之一:文件映射通常应用于大型的文件,我们可能需要对巨大的文件进行部分加锁,以便其他的进程可以修改文件中未被加锁的部分,数据库就是如此,使得多用户可以访问到未加锁的部分数据。其他的应用还知之甚少。