Java 在群集环境中如何处理同步块

Java 在群集环境中如何处理同步块,java,Java,所谓集群环境,我指的是运行在多台服务器机器上的相同代码 来自不同线程的多个请求根据到期时间同时更新卡的详细信息。下面是一段代码 synchronized(card) { //card object if(card.isExpired()) updateCard() } 我的理解是,同步块在jvm级别工作,所以在多服务器环境中是如何实现的 请建议编辑以重新表述问题。我问了我能从一个问题中回忆起什么。请看,在集群环境中,通常会有多个JVM运行相同的代码。如果流量很大,那么实际上JVM的数量可能会自

所谓集群环境,我指的是运行在多台服务器机器上的相同代码

来自不同线程的多个请求根据到期时间同时更新卡的详细信息。下面是一段代码

synchronized(card) { //card object
if(card.isExpired())
updateCard()
}
我的理解是,同步块在jvm级别工作,所以在多服务器环境中是如何实现的


请建议编辑以重新表述问题。我问了我能从一个问题中回忆起什么。

请看,在集群环境中,通常会有多个JVM运行相同的代码。如果流量很大,那么实际上JVM的数量可能会自动扩展和增加(可能会产生新的实例)。这就是为什么在分布式环境中使用静态字段保存数据时要非常小心的原因之一


接下来,进入实际问题,如果有一个jvm服务于请求,那么所有其他线程都必须等待获得该锁。若您有多个jvm正在运行,那个么由一个jvm上的一个线程获取的锁将不会阻止另一个jvm中的另一个线程获取(实际上,不同,但概念上相同)锁

我假设您希望处理只有一个线程可以编辑对象或执行操作(基于方法名称,即updatecard),我建议您实现乐观锁定(版本控制),hibernate可以很容易地做到这一点,以防止脏读。

正如您所说,同步块仅用于“本地JVM”线程。 说到集群,如何驱动分布式事务取决于您

这实际上取决于对象(如卡)的存储位置

  • 数据库-您可能需要使用一些锁定策略。很可能是乐观锁定,它存储实体的一个版本,并在每次更改时对其进行检查。或者更“安全”的悲观锁定,即在进行更改时锁定整行
  • 内存-您可能需要一些内存网格解决方案(例如Hazelcast…),并利用其事务支持或自行实现
  • 还有别的吗?您必须指定

一般来说,这很难回答。您可能希望添加更多关于您试图解决的问题的信息(从性能角度来看,全局锁可能不是一个好主意),以启用更具体的答案。在群集环境中(事实上,甚至在非群集环境中),您将不依赖于同步,而是依赖于事务隔离,以及数据库悲观锁定或乐观锁定。锁定对象时,锁定JVM中的对象。JVM不知道您打算在所有JVM中锁定该对象的所有实例。是的,因为syncronized块与JVM相关,而与环境无关。