我正在使用file.deleteOnExit()
和file.exists()
来确保我的应用程序中只有一个实例可以在任何给定的时间点运行。但是我开始发现方法存在重大缺陷:
1)您可以复制锁定文件周围的所有文件并运行可执行文件。
2)如果强制结束JVM进程,则不会删除锁定文件。
什么(除了套接字锁定)可能是一个不错的选择?
修改
使用套接字锁定只有一个进程运行良好,非常干净,但我听说可能与其他应用程序和防火墙发生冲突。例如,如果选择的端口由于某种原因被另一个进程使用,我的应用程序将认为另一个实例已经在运行 - 这就是为什么我想要一个替代解决方案。
答案 0 :(得分:1)
您可以使用FileChannel#lock()方法进行多JVM锁定:
RandomAccessFile raf = new RandomAccessFile(".lock", "rw");
FileChannel fileChannel = raf.getChannel();
fileChannel.lock();
完成后不要忘记仔细释放所有资源。