Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何缓存锁以同步对域对象的访问_Java_Multithreading_Synchronization - Fatal编程技术网

Java 如何缓存锁以同步对域对象的访问

Java 如何缓存锁以同步对域对象的访问,java,multithreading,synchronization,Java,Multithreading,Synchronization,我有一个域对象,比如一个代表用户帐户的帐户。现在我希望对帐户的访问应该同步 public void operate(Account account123) synchronized(account123){ } } 假设使用Hibernate获取帐户。多个会话可能检索同一个帐户,即显示为多个对象的帐户123 如何确保在尝试操作account123时,多个线程可以访问同一Account对象?使用数据库锁和事务,而不是Java的synchronized。您正在以错误的方式处理解决方

我有一个域对象,比如一个代表用户帐户的帐户。现在我希望对帐户的访问应该同步

public void operate(Account account123)
    synchronized(account123){
    }
}
假设使用Hibernate获取帐户。多个会话可能检索同一个帐户,即显示为多个对象的帐户123


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

使用数据库锁和事务,而不是Java的
synchronized
。您正在以错误的方式处理解决方案。

使用数据库锁和事务,而不是Java的
synchronized
。您以错误的方式处理解决方案。

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

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

尤其是在分层应用程序中,要实现这一点的层是数据库(这是数据库提供此类服务的核心功能之一)

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

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


如果总是只有一个以上的JVM执行该方法,那么当前代码就可以工作,因为同步阻塞只在该JVM进程内工作。另一个JVM不会被阻止,因此数据不一致

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

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

尤其是在分层应用程序中,要实现这一点的层是数据库(这是数据库提供此类服务的核心功能之一)

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

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


如果总是只有一个以上的JVM执行该方法,那么当前代码就可以工作,因为同步阻塞只在该JVM进程内工作。另一个JVM不会被阻止,因此数据不一致

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