2015-08-26 27 views
1

通过集群环境中我的意思是多个服务器上运行相同的代码machines.My情景是我能想到的是如下如何同步块在集群环境中处理

多个请求来根据到期时间更新卡信息从不同的线程同时进行。代码片段如下

synchronized(card) { //card object 
if(card.isExpired()) 
updateCard() 
} 

我的理解是在jvm级别同步块工作,以便在多服务器环境中实现它。

请建议编辑以更改问题。我问我能从我问到的一个问题中回忆起什么。

+0

这是很难回答的一般情况。您可能想要添加更多关于您尝试解决的问题的信息(全局锁定可能不是性能上的好主意),以启用更具体的答案。 – dhke

+0

在集群中(甚至在非集群环境中),您不会依赖于同步,而是依赖于事务隔离以及数据库悲观或乐观锁定。 –

+1

当你锁定一个对象时,你锁定了该JVM中的对象。 JVM不知道您打算在所有JVM上锁定该对象的所有实例。 –

回答

2

在集群环境中,您通常会看到多个运行相同代码的JVM。如果流量很高,那么实际上JVM的数量可以自动扩展并增加(可以生成新的实例)。这是使用静态字段将数据保存在分布式环境中时应该非常小心的原因之一。

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

+1

是的,因为syncronized block是JVM相关的,与环境无关。 –

1

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

1

正如你所说,synchronized块只用于“本地JVM”线程。 谈到集群时,如何驱动分布式事务取决于您。

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

  • 数据库 - 您可能需要使用某种锁定策略。很可能乐观锁定存储实体版本并在每次更改时检查它。或者更进一步的“安全”悲观锁定,在进行更改时锁定整行。
  • 内存 - 您可能需要一些内存网格解决方案(例如Hazelcast ...)并利用其交易支持或自己实施它
  • 任何其他?你将指定...