2010-07-07 32 views
17

我正在重新編寫一個可執行多次的Java可執行文件,並且我希望該過程一次執行一個。在C#中,我會用named/system Mutex來做到這一點,但這在Java中似乎不可行。我怎樣才能實現這個功能?在Java中獲得獨佔系統範圍的鎖

回答

7

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

例子

+0

你將如何去獨佔訪問文件? – 2010-07-07 14:54:50

+0

小雞出來:http://forums.sun.com/thread.jspa?threadID=465792 – 2010-07-07 15:00:42

+0

http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html – 2010-07-07 15:01:40

4

每次啓動Java可執行文件,啓動Java虛擬機(JVM)的新實例。他們就像一個不同的工作站。這就是爲什麼在Java中沒有像系統互斥那樣的東西。

+0

我知道它們處於不同的運行時/進程中,但許多(大多數?)操作系統提供了系統互斥功能。 Java沒有辦法訪問它嗎? – 2010-07-07 12:51:00

+0

問題是互斥鎖是一個同步工具。如果您編寫本機應用程序,則可以使用互斥鎖來同步單臺計算機邊界中的線程(或進程)。 但是,如果你編寫一個Java應用程序,比你的靜音是java.lang.Object。它有等待/通知方法,但它們僅在單個機器(JVM)的邊界內纔有意義。 舉例:在Google App Engine上託管Java雲。它按需創建新的JVM。程序員不知道新的JVM是在同一個主機上還是在集羣的另一個節點上創建的。 – Antonio 2010-07-07 14:03:51

+6

這就是例如.NET應用程序 - 但它們確實命名了互斥體。簡短的故事是,Java沒有。 – nos 2010-07-07 16:22:27

2

Java是最不常見的分母工具,它提供了所有運行平臺都通用的功能,也就是說它已經實現了。
You could use JNA(一種簡化的訪問本地功能的方法)

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

-1

請記住,Java運行在Java虛擬機下。與操作系統級別的同步機制通常只會影響其運行的機器一樣,本機Java同步機制也只能在該JVM中運行。

試圖阻止啓動多個JVM來執行某些操作與嘗試阻止應用程序在多個物理機器上同時運行類似,這可能不值得。

+1

這對於服務器端應用程序來說只是正確的。許多客戶端GUI應用程序一次只需要運行一個版本,這是沒有辦法的。 – Dennis 2013-07-12 20:14:57

+1

他不會問是不是值得的......你可能無法阻止多個jvm的開始,但誰在乎呢?重要的是把這個鎖放在程序的最早點,以便在其他進程正在運行時可以等待/中止。 – jontejj 2017-01-02 08:12:56