在语言层面上很难做到。一些分布式缓存可能会有所帮助,例如Terracotta确实处理集群环境中的同步关键字,但我还没有尝试过,而且肯定会造成性能损失。我会非常小心地让实例等待一些重要的时间,就像你的情况一样。
否则,分布式 JNDI、分布式单例或类似的东西可以使服务器实例进行通信并在此过程中检查是否有帮助。
但在实践中,通常通过乐观锁定来避免这个问题。您可能会简单地假设这只发生在一些不寻常/不太可能的时刻,并像在一个实例中那样做事情。并找出一种方法,当它没有时该怎么做。这变得更像是业务逻辑场景,最好的方法就是找到一种让用户最不可能不满意的方法。
通常在持久性/数据库级别保证一致性,所以你可以把它写在那里。我当然不会使用 synchronized 关键字来阻止可能保持几分钟或更长时间的实例,因为它要求内存泄漏或任何其他资源耗尽。
我个人喜欢在使用处理此问题的 JPA/Hibernate 时使用L2 缓存。当 OpenJPA 只通知其他实例实体已更改并且他们应该从其 L1 缓存中撤消它时,它有一种性能友好的方式来执行 L2 工作。在您的情况下,这可能是比使用同步 Java 语言关键字“同步”更好的方法。
考虑如何处理它是一种很好的态度,因为根据我的经验,它在许多应用程序中都被忽略了。它经常成为一种低概率的情况,业务导向的经理很难理解为什么应该投资它。但它具有强烈反弹的能力,以防生产中出现问题。