Сокеты будут немного проблематичными, если вы хотите, чтобы приложение запускалось одновременно под разными пользователями.
Возможна возможность использования NIO FileLock
.Вы создаете файл в каталоге пользователя, чтобы другой пользователь мог иметь свой собственный файл блокировки.Ключевым моментом здесь является попытка установить блокировку файла, если файл уже существует, путем попытки удалить его перед повторным созданием.Таким образом, если приложение аварийно завершает работу, а файл все еще там, вы все равно сможете получить блокировку для него.Помните, что ОС должна освободить все блокировки, дескрипторы открытых файлов и системные ресурсы после завершения процесса.
Примерно так:
public ExclusiveApplicationLock
throws Exception {
private final File file;
private final FileChannel channel;
private final FileLock lock;
private ExclusiveApplicationLock() {
String homeDir = System.getProperty("user.home");
file = new File(homeDir + "/.myapp", app.lock");
if (file.exists()) {
file.delete();
}
channel = new RandomAccessFile(file, "rw").getChannel();
lock = channel.tryLock();
if (lock == null) {
channel.close();
throw new RuntimeException("Application already running.");
}
Runtime.getRuntime().addShutdownHook(new Thread(() -> releaseLock());
}
private void releaseLock() {
try {
if (lock != null) {
lock.release();
channel.close();
file.delete();
}
}
catch (Exception ex) {
throw new RuntimeException("Unable to release application process lock", ex);
}
}
}
Другой альтернативой является использование библиотеки, которая делает это длятебе нравится ЮникЯ сам не пробовал, но ты можешь попробовать.Это кажется очень старым, но я полагаю, что не нужно много чего-то менять, ничего не изменилось в NIO со времен Java 1.4.
http://www.sauronsoftware.it/projects/junique/
Это на Maven Central, так что вы можете легко импортировать его.https://mvnrepository.com/artifact/it.sauronsoftware/junique/1.0.4
Если вы посмотрите на код, то увидите, что он делает то же самое с блокировками файлов: https://github.com/poolborges/it.sauronsoftware.junique/blob/master/src/main/java/it/sauronsoftware/junique/JUnique.java