Я перерабатываю исполняемый файл Java, который может запускаться несколько раз, и я хочу, чтобы процесс продолжался один за раз. В С# я бы сделал это с помощью имени /system Mutex, но это не кажется возможным в Java. Как я могу достичь этой функциональности?
Получение эксклюзивной общесистемной блокировки в Java
Ответ 1
Вы можете использовать эксклюзивный доступ к файлу файловой системы для достижения аналогичного поведения. Я не думаю, что есть что-то похожее на то, что вы упомянули.
<сильные > Примеры
Ответ 2
Каждый раз, когда вы запускаете исполняемый файл Java, вы запускаете новый экземпляр виртуальной машины Java (JVM). Они похожи на разные рабочие станции. Вот почему в Java нет такой вещи, как системный мьютекс.
Ответ 3
Java - это инструмент с наименьшим общим знаменателем, который обеспечивает функциональность, которая является общей для всех платформ, на которых она выполняется, то есть если она еще реализована.
Вы можете использовать JNA (упрощенный способ доступа к родным функциям)
В прошлом я использовал сокеты, чтобы убедиться, что программа не может запускаться, если она была запущена.
Как указано в другом месте, может работать файл на основе Семафора, конечно, недостатком этого является то, что программа сработает, тогда ваш семафор должен быть вручную reset.
Ответ 4
Если ваша операционная система предоставляет эти мьютексы, возможно, вы можете сделать это с помощью родной библиотеки? (http://en.wikipedia.org/wiki/Java_Native_Interface) Конечно, вы будете обращаться к этому ресурсу с помощью ОС, поэтому вы потеряете переносимость, чистая Java дает вам.
Ответ 5
Помните, что Java работает под виртуальной машиной Java. Подобно механизмам синхронизации на уровне ОС, как правило, они влияют только на машину, на которой она выполняется, встроенные механизмы синхронизации Java работают только в этой JVM.
Попытка предотвратить запуск нескольких JVM для выполнения чего-либо аналогична попытке предотвратить запуск приложения одновременно на нескольких физических машинах и, вероятно, не стоит усилий.