2010-07-07 45 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