在Java中获得独有的系统范围锁定

时间:2010-07-07 11:26:58

标签: java multithreading mutex

我正在重新编写可以多次启动的Java可执行文件,我希望该过程一次完成一个。在C#中,我会使用命名/系统Mutex执行此操作,但这在Java中似乎不可能。我怎样才能实现这个功能?

6 个答案:

答案 0 :(得分:8)

您可以使用对文件系统上的文件的独占访问来实现类似的行为。我认为没有类似于你提到的东西。

<强>实施例

答案 1 :(得分:3)

每次启动Java可执行文件时,都会启动Java虚拟机(JVM)的新实例。它们就像一个不同的工作站。这就是为什么Java中没有像系统互斥这样的东西。

答案 2 :(得分:3)

Java是一种最不常见的分母工具,它提供了所运行的所有平台通用的功能,即如果它已经实现的话。 You could use JNA(访问本机功能的简化方法)

过去我使用过套接字来确保一个程序在运行时无法启动 如其他地方所示,基于文件的信号量可以工作,当然这是一个缺点,如果程序崩溃,那么你的信号量必须手动重置。

答案 3 :(得分:0)

如果您的操作系统提供这些互斥锁,也许您可​​以使用本机库? (http://en.wikipedia.org/wiki/Java_Native_Interface)当然,您将以特定于操作系统的方式访问此资源,因此您将失去纯Java为您提供的可移植性。

答案 4 :(得分:0)

在我看来,可以使用Singleton设计模式来解决这种情况。在Windows中使用C时,我可以通过使用MutexCreateGlobal()调用来解决此问题。当使用OOP语言(例如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;
    }

}

答案 5 :(得分:-1)

请记住,Java在Java虚拟机下运行。与OS级同步机制一样,通常只会影响运行它的机器,本机Java同步机制只能在该JVM中运行。

尝试阻止多个JVM启动以执行某些操作类似于尝试阻止应用程序在多个物理计算机上同时运行,并且可能不值得付出努力。