【问题标题】:How do I allow only 1 Java Semaphore to be created on a server?如何只允许在服务器上创建 1 个 Java 信号量?
【发布时间】:2013-06-07 17:59:46
【问题描述】:

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

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

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

这可能吗?如果有,怎么做?

【问题讨论】:

  • 你的意思是什么信号量?如果是java.util.concurrent.Semaphore,这个问题就没有意义了。如果某种系统信号量在所有进程中都可用,那么您应该命名所使用的操作系统。
  • @AlexeiKaigorodov 是的 java.util.Semaphore。我希望它适用于任何 O/S(这就是 Java 的想法)。谢谢

标签: java semaphore


【解决方案1】:

你可以在/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() 释放锁。

【讨论】:

  • 即使在 jvm 被意外杀死后,该文件仍将继续存在;阻止该应用程序的任何进一步实例化。
  • 当然,你必须使用某种方式:docs.oracle.com/javase/6/docs/api/java/nio/channels/…
  • 更复杂的文件可以包含 JVM 进程 ID 以检查它是否处于活动状态。
  • +1 表示 nio 锁。我相信这对于@David 的目的是可以接受的。显示一些代码/示例/链接以确保完整性。
  • 我认为这行不通。如果应用没有对该目录的 R/W 访问权限怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多