2017-01-30 39 views
1

我有一个域对象说一个帐户代表用户的帐户。现在我希望对账户的访问应该同步。如何缓存用于同步访问域对象的锁

public void operate(Account account123) 
    synchronized(account123){ 
    } 
} 

假设Hibernate被用来获取帐号。多个会话可能会检索相同的帐户,即帐户123显示为多个对象

如何确保多个线程在尝试操作account123时访问同一个Account对象?

回答

0

通过使用数据库锁定和事务而不是Java的​​。您正在以错误的方式接近解决方案。

0

在任何情况下,在谈论数据库时,都需要一些被称为事务的东西。

换句话说:您需要保证不同的进程不会并行运行并且会造成数据不一致。

特别是在分层应用程序,这样做的层为数据库(即的数据库的功能来提供这种服务的一个)。

或者,(有时)可以在更高层中构建这样的逻辑;但那是A)更难和B)更容易出错。

因此,理想情况下,您需要查看底层数据库以及此组件向您提供的机制。

您当前的代码的工作,如果有总是只比一个 JVM执行该方法 - 作为同步仅阻断JVM进程中的工作原理。另一个JVM不会被阻塞,因此数据不一致。

+0

让我这样说吧:我有一些内存中的操作要做与事件E1上的特定实体相关的操作。当我为该实体(A)执行这些操作时,有可能发生与同一实体(A)相关的其他一些事件,如E2。现在E1和E2的操作应该同步,因此我想锁定实体A.因此,我想要缓存实体A的锁定。 – user2599052