Java tryLock释放锁定多个JVM

时间:2016-03-29 07:46:10

标签: java nio filelock

我在Java上用Linux上的文件锁有问题 我在不同的主机(A和B)上有两个应用程序和用于文件锁定的共享文件夹。 在A中,我获得了channel.lock()的锁定。 然后我在B中调用channel.tryLock()。它会抛出OverlappingFileLockException。好吧。 但后来我在A中调用channel.tryLock()(它抛出OverlappingFileLockException)。在此之后,在B channel.tryLock()中返回有效锁定而没有任何例外。

有人有同样的问题。感谢

1 个答案:

答案 0 :(得分:3)

来自Java Doc(方法tryLock()

  

如果由于重复锁定而无法获取锁定   另一个程序然后它返回null。 如果无法获得锁定   由于任何其他原因,会抛出适当的异常。

这意味着tryLock方法会抛出OverlappingFileLockException,如果还有其他问题而不是其他具有锁定的应用程序。

如果你是多线程的,你应该知道:

  

代表整个Java虚拟机保存文件锁。 它们不适合控制同一虚拟机中多个线程对文件的访问。

如果你继续阅读该例外:

  

OverlappingFileLockException - 如果一个锁与请求重叠   区域已由此Java虚拟机保留,或者如果是另一个   线程已在此方法中被阻止,并且正在尝试锁定   重叠的同一文件区域

所以我认为你的问题是你试图通过已经拥有锁的同一个应用程序来获取锁。你必须为我检查它,但似乎在这种情况下它不会返回null,而是抛出异常。

另外:如果您尝试从同一个应用程序锁定文件,则文档没有说明会发生什么。如果其他应用程序已获得锁定,它总是会提到返回null

  

表示新获取的锁的锁对象,,如果是,则为null   无法获取锁定,因为另一个程序持有   重叠锁

Link to JavaDoc