我正在开发Java应用程序。我想阻止用户同时运行同一个Java应用程序的更多实例。我使用Java的JUnique应用程序锁定库,它效果很好。但是当它崩溃时会遇到一个严重的问题。如果应用程序崩溃,JUnique锁定的应用程序不会运行
应用程序如果崩溃就无法启动,它只是返回AlreadyLockedException。下面是我用来锁定我的应用程序的代码。
public static boolean isRunning() {
boolean alreadyRunning = false;
try {
JUnique.acquireLock(appId);
alreadyRunning = false;
} catch (AlreadyLockedException e) {
logger.error("Unable to acquire lock. There is an instance already running");
alreadyRunning = true;
} catch (Throwable t) {
logger.error("Unable to acquire lock. ", t);
}
return alreadyRunning;
}
和代码来释放我的锁是:
public static void release() {
try {
JUnique.releaseLock(appId);
} catch (Throwable t) {
logger.error("Error releasing the lock", t);
}
}
我可以使用release()方法来处理预期的崩溃。但真正的问题发生在运行时应用程序意外崩溃。应用程序终止而不释放获取的应用程序锁。
如果应用程序意外崩溃,我们该如何释放JUnique锁定?
定义“崩溃”。该文档声明锁定“将在JVM暂停时自动释放”。另外,打印并发布该'AlreadyLockedException'的堆栈跟踪。 – chrylis 2014-08-29 08:47:19
您可以尝试注册['Thread.UncaughtExceptionHandler'](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html) – MadProgrammer 2014-08-29 08:58:11
@chrylis,这就是它释放锁,但如果其他程序也在运行JVM,那么JVM不会停止。即使我的应用程序崩溃,锁仍然会存在于JVM中。 – Crawler 2014-08-29 10:02:46