java - 如何让线程等待,直到另一个线程完成该方法执行

标签 java spring jpa concurrency

虽然这个问题看起来很基本,但我的场景与@stackoverflow 的其他帖子有很大不同。我正在使用 Spring 和 JPA & jersey(REST) 实现。每当我从curl到我的Java REST方法同时发出2个请求以更新数据库资源时,第一个请求会成功执行,但第二个请求会因乐观锁异常而失败:

javax.persistence.OptimisticLockException: Exception [EclipseLink-5006] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.OptimisticLockException Exception Description: The object cannot be updated because it has changed or been deleted since it was last read.

我尝试将更新的代码放入同步块(synchronized block)中,但没有成功。

我也尝试过将其余方法声明为同步,但没有成功。

现在我希望我的方法由第一个请求执行,并希望第二个请求等待第一个请求完成其执行。

我已经使用 static 变量实现了此目的,但由于代码标准,我不想使用 static 变量。

有人可以为此提供有效的解决方案吗?

最佳答案

在数据库调用之前使用同步会有所帮助。

1)使用Synchronized关键字

synchronized(this){
//process
}

2)另一个选项是在方法名之前使用synchronized

synchronized void <method(){
//process
}

关于java - 如何让线程等待,直到另一个线程完成该方法执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43477625/

相关文章:

java - Libgdx 游戏在 Android 上崩溃

java - 如何在多个 JVM 之间拥有一个通用对象

java - 如何检查 double 是否最多有 n 位小数?

Java - 通过 setter 方法设置对象变量,但我不想再次更改它

java - Hibernate - 一对多关系

java - org.hibernate.MappingException : Unable to find column with logical name Id

java - 如何优化hibernate循环中的方法调用?

java - 如何防止hibernate在多对多映射中插入一个表

java - 如何防止列表中字符参数重复?

javascript - Angular 帖子未按预期提供请求正文