Вы можете использовать FileLock, он также работает в средах, где несколько пользователей совместно используют порты:
String userHome = System.getProperty("user.home");
File file = new File(userHome, "my.lock");
try {
FileChannel fc = FileChannel.open(file.toPath(),
StandardOpenOption.CREATE,
StandardOpenOption.WRITE);
FileLock lock = fc.tryLock();
if (lock == null) {
System.out.println("another instance is running");
}
} catch (IOException e) {
throw new Error(e);
}
Также выживает сборщик мусора.
Блокировка снимается, как только ваш процесс завершается, не имеет значения, происходит ли регулярный выход, сбой или что-то в этом роде.