【问题标题】:how to cache locks for synchronizing access to domain objects如何缓存锁以同步访问域对象
【发布时间】:2017-01-30 18:19:33
【问题描述】:

我有一个域对象说一个代表用户帐户的帐户。现在我希望同步对帐户的访问。

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

假设正在使用 Hibernate 来获取帐户。多个会话可能检索到同一个帐户,即显示为多个对象的帐户 123

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

【问题讨论】:

    标签: java multithreading synchronization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      特别是在分层应用程序中,执行此操作的层是数据库(这是提供此类服务的数据库的核心功能之一)。

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

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

      如果始终只有 一个 JVM 执行该方法,则您当前的代码有效 - 因为 同步 阻塞仅在该 JVM 进程中有效。另一个JVM不会被阻塞,因此数据不一致。

      【讨论】:

      • 让我这样说:我有一些与事件 E1 上的特定实体相关的内存操作。当我为该实体(A)执行这些操作时,可能会发生与同一实体(A)相关的其他一些事件,例如 E2。现在 E1 和 E2 的操作应该是同步的,因此我想锁定实体 A。因此我想为实体 A 缓存该锁定。
      猜你喜欢
      • 2014-03-27
      • 2018-12-30
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 2013-04-25
      • 1970-01-01
      相关资源
      最近更新 更多