Получение эксклюзивной общесистемной блокировки в Java - PullRequest
17 голосов
/ 07 июля 2010

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

Ответы [ 6 ]

8 голосов
/ 07 июля 2010

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

Примеры

3 голосов
/ 07 июля 2010

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

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

3 голосов
/ 07 июля 2010

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

0 голосов
/ 08 апреля 2019

Мне кажется, что ситуацию можно разрешить с помощью шаблона проектирования Singleton. При использовании C в Windows я решаю проблему с помощью вызова MutexCreateGlobal(). При использовании языка ООП (т.е. Java) модифицированный шаблон проектирования Singleton, кажется, делает свое дело.

public class Singleton {

    // **** members ****
    private static  Singleton   singleInstance = null;

    private static  Semaphore   sem = new Semaphore(1);

    public          int         val = 0;

    // **** constructor ****
    private Singleton() {
        val = 0;
    }

    // **** get instance of this class ****
    public static Singleton getInstance() {

        // **** request access ****
        try {
            sem.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // **** instantiate this class (if needed) ****
        if (singleInstance == null) {

            // **** instantiate Singleton ****
            singleInstance = new Singleton();

            // **** inform user what is going on ****
            System.out.println("hashCode: " + singleInstance.hashCode());
        }

        // **** release access ****
        sem.release();

        // **** return this class ****
        return singleInstance;
    }

}
0 голосов
/ 07 июля 2010

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

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

0 голосов
/ 07 июля 2010

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

...