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