Если вы используете Mutex, логически этот Mutex должен быть доступен с любой JVM, на которой выполняется копия «программы». В программировании на C это может быть выполнено через разделяемую память, но по умолчанию в Java этого нет.
При таком понимании есть множество способов реализовать то, что вы хотите. Вы можете открыть серверный сокет на назначенном порту (операционная система гарантирует, что только один процесс является получателем серверного сокета, и последующие открытия завершаются ошибкой).
Вы можете использовать «файл блокировки», но это немного сложно, так как файл, который вам нужно будет использовать, действительно будет каталогом (и он сильно зависит от того, является ли создание каталога атомарным для вашей файловой системы, даже если большинство созданий каталогов находятся). Если системный администратор решит запустить вас через NFS, все станет еще сложнее (если не невозможно).
Вы также можете проделать ряд изящных трюков с JVM и отладкой / JMI, при условии, что вы можете каким-то образом убедить себя, что все соответствующие JVM запускаются с одинаковыми конфигурациями (со временем, это невыполнимая задача).
Другие люди использовали функцию exec для запуска эквивалента списка процессов, но это немного сложно из-за возможности состояния гонки (два процесса одновременно проверяют и не видят друг друга).
В конце концов, маршрут сокета сервера, вероятно, является наиболее стабильным, поскольку он гарантированно привязывается только к одному процессу стеком TCP / IP (и осуществляется через операционную систему). Тем не менее, вам придется очистить сокет входящих сообщений, и это открывает возможность других проблем с безопасностью.
person
Edwin Buck
schedule
09.05.2012