Java文件锁定(File Lock)学习

对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件。

在 JDK 1.4 版本之前,Java I/O 模型都未能提供文件锁定(file locking),JDK 1.4 版本发布时 Java 编程人员才可以使用文件锁(file lock)。 

Java文件锁定一般都通过FileChannel来实现。主要涉及如下2个方法:

  • tryLock() throws IOException  试图获取对此通道的文件的独占锁定。
  • tryLock(long position, long size, boolean shared) throws IOException  试图获取对此通道的文件给定区域的锁定。

  锁(lock)可以是共享的(shared)或独占的(或者叫做排他 exclusive)。文件锁定特性在很大程度上依赖本地的操作系统实现。并非所有的操作系统和文件系统都支持共享文件锁。对于那些不支持的,对一个共享锁的请求会被自动提升为对独占锁的请求。这样可以保证准确性却可能严重影响性能。 

  并非所有平台都以同一个方式来实现基本的文件锁定。在不同的操作系统上,甚至在同一个操作系统的不同文件系统上,文件锁定的语义都会有所差异。一些操作系统仅提供劝告锁定(advisory locking),一些仅提供独占锁(exclusive locks),而有些操作系统可能两种锁都提供。你应该总是按照劝告锁的假定来管理文件锁,因为这是最安全的。但是如能了解底层操作系统如何执行锁定也是非常好的。例如,如果所有的锁都是强制性的(mandatory)而您不及时释放您获得的锁的话,运行在同一操作系统上的其他程序可能会受到影响。
  锁与文件关联,而不是与通道关联。我们使用锁来判优外部进程(决定哪个进程优先访问文件),而不是判优同一个 Java 虚拟机上的线程。如果一个线程在某个文件上获得了一个独占锁,然后第二个线程利用一个单独打开的通道来请求该文件的独占锁,那么第二个线程的请求会被批准。但如果这两个线程运行在不同的 Java 虚拟机上,那么第二个线程会阻塞,因为锁最终是由操作系统或文件系统来判优的并且几乎总是在进程级而非线程级上判优。 

你可能感兴趣的:(java文件锁)