在Java中获得独有的系统范围锁定

我正在重新编写可以多次启动的Java可执行文件,我希望该过程一次完成一个。 在C#中,我会使用命名/系统Mutex执行此操作,但这在Java中似乎不可能。 我该如何实现此function?

您可以使用对文件系统上的文件的独占访问来实现类似的行为。 我认为没有类似于你提到的东西。

例子

  • Java编程[存档] – 在独占锁中打开文件
  • java.nio.channels.FileLock中

每次启动Java可执行文件时,都会启动Java虚拟机(JVM)的新实例。 它们就像一个不同的工作站。 这就是Java中没有像系统互斥这样的东西的原因。

Java是一种最不常见的分母工具,它提供了所运行的所有平台通用的function,即如果它已经实现的话。
您可以使用JNA (一种访问本机function的简化方法)

在过去,我使用过套接字来确保程序在运行时无法启动。
如其他地方所示,基于文件的信号量可以工作,当然这是一个缺点,如果程序崩溃,那么你的信号量必须手动重置。

如果您的操作系统提供这些互斥锁,也许您可​​以使用本机库? ( http://en.wikipedia.org/wiki/Java_Native_Interface )当然,您将以特定于操作系统的方式访问此资源,因此您将失去纯Java为您提供的可移植性。

请记住,Java在Java虚拟机下运行。 与OS级同步机制一样,通常只会影响运行它的机器,本机Java同步机制只能在该JVM中运行。

试图阻止多个JVM启动以执行某些操作类似于尝试阻止应用程序在多个物理计算机上同时运行,并且可能不值得付出努力。