簡體   English   中英

在Java中獲得獨有的系統范圍鎖定

[英]Getting exclusive system-wide lock in Java

我正在重新編寫可以多次啟動的Java可執行文件,我希望一次一個進程。 在C#中,我會使用命名/系統Mutex執行此操作,但這在Java中似乎不可能。 我該如何實現此功能?

您可以使用對文件系統上的文件的獨占訪問來實現類似的行為。 我認為沒有類似於你提到的東西。

例子

每次啟動Java可執行文件時,都會啟動Java虛擬機(JVM)的新實例。 它們就像一個不同的工作站。 這就是為什么在Java中沒有類似系統互斥的東西。

Java是一種最不常見的分母工具,它提供了所運行的所有平台通用的功能,即如果它已經實現的話。
您可以使用JNA (一種訪問本機功能的簡化方法)

在過去,我使用過套接字來確保程序在運行時無法啟動。
如其他地方所示,基於文件的信號量可以工作,當然這是一個缺點,如果程序崩潰,那么你的信號量必須手動重置。

如果您的操作系統提供這些互斥鎖,也許您可​​以使用本機庫? http://en.wikipedia.org/wiki/Java_Native_Interface )當然,您將以特定於操作系統的方式訪問此資源,因此您將失去純Java為您提供的可移植性。

在我看來,可以通過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;
    }

}

請記住,Java在Java虛擬機下運行。 與OS級同步機制一樣,通常只會影響運行它的機器,本機Java同步機制只能在該JVM中運行。

嘗試阻止多個JVM啟動以執行某些操作類似於嘗試阻止應用程序在多個物理計算機上同時運行,並且可能不值得付出努力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM