【发布时间】:2018-05-01 23:12:46
【问题描述】:
我的要求是这样的:
我编写了一个代码来检查数据库中的数据,如果没有找到数据,它会使用第三方 rest API 来获取数据。执行一些逻辑,最终得到的数据存入数据库。
public void exampleMethod(){
MyObject myObj = getObjFromDatabase(); //getting from db
if(myObj==null){ //not found in db
myObj = getObjFromThirdParty(); //consuming rest api
//some logic here in case myobj is not in db....
}else{
//some other logic here in case myobj is in db...
}
saveObjInDatabase(myObj); //saving it in database
}
我只需要将它保存在数据库中一次。从第三方 API 获取响应需要一些时间,并且此方法需要从多个线程中执行。
现在,问题是我只需要将它保存在数据库中一次,但是在一个线程可以将数据保存在数据库中之前,另一个线程从数据库中获取空值,只有当“数据不在数据库中”时才应该执行的逻辑被执行并保存同一数据不止一次。 (我正在使用 mongoDB 来存储数据)
我怎么解决这个问题?谢谢你。
【问题讨论】:
-
简短的回答是“锁定”。我会说您可能应该在数据库端进行锁定,这样如果您有多个 JVM 同时针对同一个数据库运行此代码,它就会起作用。会是这样吗?如果没有,那么您可以在 Java 代码中使用锁定。
-
上下文不清楚,但听起来多个线程正在创建一个
myObj,其中每个线程的myObj只是same 对象的不同实例。最简单的方法是同步exampleMethod()。 -
同步
exampleMethod()可能是最简单的解决方案,但是如果有很多并发读取,那会阻塞很多,不需要这样做。如果另一个线程正在更新值,线程只需要停止并等待。
标签: java multithreading