Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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_Spring_Jpa_Concurrency - Fatal编程技术网

Java 如何使线程等待另一个线程完成该方法的执行

Java 如何使线程等待另一个线程完成该方法的执行,java,spring,jpa,concurrency,Java,Spring,Jpa,Concurrency,虽然这个问题看起来很基本,但我的场景与其他帖子@stackoverflow有很大不同。我将spring与JPA&jerseyREST实现一起使用。无论何时,为了更新数据库资源,我从curl到Java REST方法并发地命中2个请求,第一个请求成功执行,但第二个请求失败,出现乐观锁异常: javax.persistence.OptimisticLockException:异常 [EclipseLink-5006]Eclipse持久性服务- 2.5.2.v20140319-9ad6abd:org.e

虽然这个问题看起来很基本,但我的场景与其他帖子@stackoverflow有很大不同。我将spring与JPA&jerseyREST实现一起使用。无论何时,为了更新数据库资源,我从curl到Java REST方法并发地命中2个请求,第一个请求成功执行,但第二个请求失败,出现乐观锁异常:

javax.persistence.OptimisticLockException:异常 [EclipseLink-5006]Eclipse持久性服务- 2.5.2.v20140319-9ad6abd:org.eclipse.persistence.exceptions.OptimisticLockException 描述:无法更新对象,因为它已更改或 自上次读取后已被删除

我曾尝试将更新后的代码放入同步块,但没有成功

我还尝试声明rest方法已同步,但不起作用

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

我使用静态变量实现了这一点,但由于代码标准,我不想使用静态变量


有人能提供有效的解决方案吗?

在DB调用之前使用同步将有所帮助

1使用同步关键字

synchronized(this){
//process
}
2另一个选项是在方法名称之前使用synchronized

synchronized void <method(){
//process
}

只要在同一个实例上进行同步,在同步块中执行数据库操作就应该有效。提供更多关于您使用什么作为锁以及如何使用它的详细信息。持久性告诉您的是,您的第二次更新与第一次更新存在竞争,根据您的问题,这是正确的。结果,第二个到达内部持久性的syncronized块的更新都没有看到第一个更新,并且由于这两个更新的实体相同,第二个更新被拒绝,因为它的数据过时了。在这种情况下,理想情况下您应该做的是清除过时的请求,并使用更新的实体重新初始化它,然后再次尝试更新。您的映射类中是否有带有相应表列的@Version字段?@eg04lt3r-我的表中有Version列,它在每次更新后都会更新。@M.Prokhorov是的,您是对的,我试图用过时的对象进行更新,因此会出错,但您能否建议一种有效的方法。