如何在服务器上只允许创建1个Java信号量?

时间:2013-06-07 17:59:47

标签: java semaphore

这与How do I allow only 1 named Semaphore to be created on a server?类似,但我在这里要求Java。

我想在我的Java应用程序中创建一个信号量,如果应用程序的另一个实例正在运行并且已经创建了信号量,那么创建将失败(有明显的例外)。所以每个服务器只有一个。

我只想在服务器上保留一个限制,而不仅仅是JVM。但我不希望它跨越多个服务器(或VM)。即我希望该应用程序能够在2个不同的服务器上运行。

这可能吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

您可以在mywebapp.lock目录中编写/tmp文件,并检查该文件是否存在。

这是您可以使用的一些代码之王(未经测试):

假设applicationFileLockFileLock,它将在应用程序执行期间保持锁定。您可以在应用程序启动期间执行以下代码:

FileOutputStream fos = new FileOutputStream(new File(System.getProperty("java.io.tmpdir"),"mywebapp.lock"));
try {
   applicationFileLock = fos.getChannel().tryLock();
   if (fileLock == null) {
     throw new AlreadyStartedApplicationException("Cannot ...");
   }
} catch (IOException e) {
   // handle or rethrow.
}

请务必使用应用程序末尾的applicationFileLock.release()解除锁定。