我正在重新編寫一個可執行多次的Java可執行文件,並且我希望該過程一次執行一個。在C#中,我會用named/system Mutex來做到這一點,但這在Java中似乎不可行。我怎樣才能實現這個功能?在Java中獲得獨佔系統範圍的鎖
回答
您可以使用對文件系統上文件的獨佔訪問來實現類似的行爲。我不認爲有類似於你所提到的東西。
例子
每次啓動Java可執行文件,啓動Java虛擬機(JVM)的新實例。他們就像一個不同的工作站。這就是爲什麼在Java中沒有像系統互斥那樣的東西。
我知道它們處於不同的運行時/進程中,但許多(大多數?)操作系統提供了系統互斥功能。 Java沒有辦法訪問它嗎? – 2010-07-07 12:51:00
問題是互斥鎖是一個同步工具。如果您編寫本機應用程序,則可以使用互斥鎖來同步單臺計算機邊界中的線程(或進程)。 但是,如果你編寫一個Java應用程序,比你的靜音是java.lang.Object。它有等待/通知方法,但它們僅在單個機器(JVM)的邊界內纔有意義。 舉例:在Google App Engine上託管Java雲。它按需創建新的JVM。程序員不知道新的JVM是在同一個主機上還是在集羣的另一個節點上創建的。 – Antonio 2010-07-07 14:03:51
這就是例如.NET應用程序 - 但它們確實命名了互斥體。簡短的故事是,Java沒有。 – nos 2010-07-07 16:22:27
如果您的操作系統提供這些互斥鎖,也許您可以使用本機庫? (http://en.wikipedia.org/wiki/Java_Native_Interface)當然,您將以操作系統特定的方式訪問此資源,因此您將失去純Java提供的可移植性。
Java是最不常見的分母工具,它提供了所有運行平臺都通用的功能,也就是說它已經實現了。
You could use JNA(一種簡化的訪問本地功能的方法)
在過去,我使用套接字來確保程序在啓動時無法啓動。
正如其他地方所指出的基於文件的信號量可以工作,當然這是一個缺點,如果程序崩潰,那麼你的信號量必須手動重置。
請記住,Java運行在Java虛擬機下。與操作系統級別的同步機制通常只會影響其運行的機器一樣,本機Java同步機制也只能在該JVM中運行。
試圖阻止啓動多個JVM來執行某些操作與嘗試阻止應用程序在多個物理機器上同時運行類似,這可能不值得。
- 1. 無法獲得獨佔鎖定文件
- 2. 系統分析中的系統範圍
- 3. MySQL:獨佔鎖
- 4. 在java中的範圍鎖定
- 5. Java - 鎖定獨佔訪問的文件
- 6. 預約系統的範圍
- 7. NHibernate:獨佔鎖定
- 8. 在mysql中的獨佔讀取鎖
- 9. 在Android系統中繪製覆蓋圖(系統範圍)
- 10. Socat對PTY的獨佔鎖
- 11. 在java中設置系統範圍/全局代理
- 12. php:獨佔鎖定文件從未獲得
- 13. Java中的文件系統鎖
- 14. 系統範圍I/O統計
- 15. 系統未在範圍內聲明?
- 16. 插入獨佔鎖定
- 17. SQL Server 2000獨佔鎖定
- 18. SQLite非獨佔RESERVED鎖?
- 19. 如何獲得SortedSet的獨佔尾部?
- 20. Java中的獨佔NOR
- 21. 如何在Windows中獲取進程獨佔鎖定文件夾?
- 22. 共享鎖和獨佔鎖將首先獲取數據?
- 23. ES6類和模塊系統的範圍
- 24. 管理系統範圍的參數C
- 25. Linux系統範圍的Python互斥體
- 26. 系統範圍的RVM安裝問題
- 27. 如何設置系統範圍的umask?
- 28. 我想從java獲得系統keyEvent
- 29. 獲得跨系統
- 30. JavaScript/jQuery日期選擇器允許包含範圍和獨佔範圍?
你將如何去獨佔訪問文件? – 2010-07-07 14:54:50
小雞出來:http://forums.sun.com/thread.jspa?threadID=465792 – 2010-07-07 15:00:42
http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileLock .html – 2010-07-07 15:01:40