【发布时间】:2015-12-02 10:02:57
【问题描述】:
我编写了一个小方法,用于告诉我应用程序的另一个实例是否已经在运行。我知道有很多方法可以确定另一个实例是否正在运行,但我选择了这个。我正在创建一个空文件并在应用程序实例期间保持锁定。如果另一个实例正在运行,tryLock() 方法应该返回 null:
private static boolean alreadyRunning() throws IOException {
FileChannel fc = FileChannel.open(MYLOCKFILE,
StandardOpenOption.CREATE,
StandardOpenOption.WRITE,
StandardOpenOption.DELETE_ON_CLOSE);
return fc.tryLock() == null;
}
(MYLOCKFILE 是我临时目录中文件的Path。)
在 Windows 7 Professional 64 位上对此进行测试时,我发现它在第一个实例和第二个尝试实例上都按预期工作。但是,在第二个实例退出后(仅让第一个实例运行),当运行第三个实例时,tryLock() 调用将抛出 java.nio.file.AccessDeniedException 而不是返回 null。你能解释一下这种行为吗?如果这被认为是正常行为,我如何区分已锁定文件的现有实例和真正的“访问被拒绝”情况,例如白痴将 TEMP 目录设置为只读?
【问题讨论】:
-
我刚刚意识到我的方法是错误的。抛出的不是 tryLock() 调用,而是 FileChannel.open() 调用。第三个实例在被另一个进程锁定时无法打开。不知为何二审能成功打开通道。在我的固定版本中,我使用 try 块来捕获 FileChannel.open() 抛出的时间。
标签: java nio filelock filechannel