2012-12-09 15 views
3

我使用的是file.deleteOnExit()file.exists()以確保我的應用程序只有一個實例可以在任何給定的時間點運行。不過,我開始發現該方法的主要缺陷:替代文件鎖定以確保只能啓動一個應用程序實例

1)您可以複製鎖定文件周圍的所有文件並運行可執行文件。

2)如果JVM進程強制結束,鎖定文件不會被刪除。

什麼(除了套接字鎖定或許)將是一個很好的選擇?

編輯:
使用插座鎖定到只有一個進程工作得很好,很乾淨,但我聽說過與其他應用程序和防火牆的潛在衝突。例如,如果選擇的端口出於某種原因被另一個進程使用,我的應用程序會認爲另一個實例已經在運行 - 這就是爲什麼我想要一個替代解決方案。

+0

是否要鎖定多線程環境的文件? –

+0

該文件將爲空,僅用於檢查另一個實例是否已在運行。 IMO是一種天真的方法,儘管我想不出另一種沒有衝突可能性的簡潔解決方案(比如套接字綁定)。 – rtheunissen

+0

如果應用程序。有一個GUI,使用['SingleInstanceService'](http://docs.oracle.com/javase/7/docs/jre/api/javaws/jnlp/javax/jnlp/SingleInstanceService.html)。 –

回答

0

您可以使用FileChannel#鎖多JVM鎖定()方法:

RandomAccessFile raf = new RandomAccessFile(".lock", "rw"); 
FileChannel fileChannel = raf.getChannel(); 
fileChannel.lock(); 

不要忘記仔細地釋放所有的資源,當你完成。

+0

我試過這個,但問題是,你仍然可以刪除JVM外的文件,在這種情況下可以運行多個實例。 – rtheunissen

+0

我似乎記得(它可能已經改變)'FileChannel#lock'是操作系統特定的,可能不可用或所有操作系統的 – MadProgrammer

+0

我已經在Linux和Windows上使用這種方法,仍然無法保證它可以在任何地方工作。 – hoaz

相關問題