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

标签 java semaphore

这类似于 How do I allow only 1 named Semaphore to be created on a server?但我在这里问的是 Java。

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

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

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

最佳答案

你可以在/tmp目录下写一个mywebapp.lock文件,检查这个文件是否存在。

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

假设 applicationFileLock 是一个 FileLock,它将在应用程序执行期间持有锁。您可以在应用程序启动期间执行以下代码:

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() 释放锁。

关于java - 如何只允许在服务器上创建 1 个 Java 信号量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990241/

相关文章:

c - 可能的堆栈损坏

java - 如何在 Java FX 的网格 Pane 上动态添加行?

java - 信号量锁的正确实现?

c++ - 信号量和互斥锁

构造函数的字符串输入参数的 Java 越界异常

java - 如何在Java中实现二进制信号量类?

c++ - 使用 Peterson 的 N 进程算法的信号量实现

java - curl 错误 : could not resolve host, java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

java - ( Hibernate Oracle 无法插入 NULL ) 如何插入自动生成的 ID?

java - play framework (java) list-modules got 不是一个有效的命令