Получение эксклюзивной блокировки на системном уровне в Java

Я переделываю исполняемый файл Java, который может быть запущен многократно, и я хочу, чтобы процесс продолжился по одному. В C# я сделал бы это с именованным Взаимным исключением / системным Взаимным исключением, но это, кажется, не возможно в Java. Как я могу достигнуть этой функциональности?

17
задан bohdan_trotsenko 25 July 2013 в 12:00
поделиться

5 ответов

Вы можете использовать эксклюзивный доступ к файлу в файловой системе для достижения аналогичного поведения. Я не думаю, что существует что-то похожее на то, что вы упомянули.

Примеры

8
ответ дан 30 November 2019 в 14:24
поделиться

Java является наименее распространенным инструментом знаменателя, который предоставляет функциональность, общую для всех платформ, на которые он работает, то есть если он еще не реализован.
Вы можете использовать JNA (упрощенный способ доступа к собственной функциональности)

В прошлом я использовал сокеты, чтобы убедиться, что программа не может запуститься, если она запущена.
Как указано в другом месте, семафор на основе файла может работать, конечно, недостатком этого является то, что если программа аварийно завершает работу, то ваш семафор должен быть сброшен вручную.

3
ответ дан 30 November 2019 в 14:24
поделиться

Каждый раз при запуске исполняемого файла Java запускается новый экземпляр виртуальной машины Java (JVM). Они похожи на разные рабочие станции. Вот почему в Java нет такой вещи, как системный мьютекс.

3
ответ дан 30 November 2019 в 14:24
поделиться

Помните, что Java работает под управлением виртуальной машины Java. Как механизмы синхронизации на уровне ОС обычно влияют только на машину, на которой она запущена, так и механизмы синхронизации Java работают только внутри этой JVM.

Попытка предотвратить запуск нескольких JVM для выполнения чего-либо аналогична попытке предотвратить одновременный запуск приложения на нескольких физических машинах и, вероятно, не стоит усилий.

-1
ответ дан 30 November 2019 в 14:24
поделиться

Если ваша операционная система предоставляет такие мьютексы, возможно, вы могли бы обойтись нативной библиотекой? ( http://en.wikipedia.org/wiki/Java_Native_Interface ) Конечно, вы будете обращаться к этому ресурсу специфическим для ОС способом, так что вы потеряете переносимость, которую дает чистая Java.

0
ответ дан 30 November 2019 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: