我正在尝试解决一个问题,我想确保不同机器上运行的多个进程之间的互斥性。我想确保始终有且只有一个进程执行关键部分。为了实现这一点,我在数据库中维护一个锁,该锁会随着时间的推移而过期。它会过期以避免饥饿。
现在,鉴于 JVM 可以随时进入停止世界 (STW) 状态,这意味着,如果一个进程处于 STW 状态足够长的时间,另一个进程就可以进入临界区。我想知道-
- If there is a way a thread can be notified/killed before JVM starts STW?
- If there is a way I can configure JVM not do STW while a thread is in the critical section of the code?
- If there is a way an application could specify the 'safe points' to JVM?
- If there is a way I can configure JVM to crash instead of going into STW?
PS:据我了解,根据 JVM 配置创建的锁可能会出现非常大的超时。它将确保 JVM STW 在锁到期之前完成。但这并不是面向 future 的,也不是讨论的重点。我也不是在寻找减少 SWT 数量或 STW 持续时间的方法,因为他们无法保证我正在寻找的内容。
最佳答案
存在专门的实时 JVM,它们通常具有专门的无分配线程,不会在 GC 上挂起。但这些通常针对嵌入式系统,如果您的目标只是避免释放数据库锁,那么这将是一个相当生硬的工具。
或者,Redhat 提供带有 Shenandoah 的 OpenJDK 构建和带有 C4 的 Azul,它们几乎是无暂停的收集器。
或者您可以简单地尝试调整 JVM 以使暂停时间低于锁定超时。
To achieve that, I maintain a lock in a database which expires with time.
您应该考虑实现无锁读取复制(原子)更新算法。
If the task is not idempotent, you see an inconsistency.
因此,使您的任务具有幂等性将是另一种选择。
通常,如果应用程序的一致性保证依赖于可能会自发违反的锁,那么您的应用程序设计似乎是不正确的。
关于java - 避免 JVM 在代码的关键部分停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48292013/