【发布时间】:2020-05-15 10:29:00
【问题描述】:
在下面的 Java ToolHireService 中,我如何以最佳方式防止同一工具可以被多个客户雇用的并发问题。只有在评估租用同一工具时,它才应该“阻塞线程”。
任何关于如何编写失败测试的指针?
public class ToolHireService {
public int toolHire(Client client , String toolId , Date startDate , Date endDate){
Tool tool = getToolFromDB(toolId);
if(tool == null || tool.isHired()){
return -1;
}
ToolHireEntry toolEntry = new ToolHireEntry(tool,startDate,endDate);
client.addHireHistory(toolEntry);
client.save();
tool.setHired(true);
return tool.save();
}
}
PS:只要使用不同的工具,预订就应该能够不间断地进行。
【问题讨论】:
-
嗯,这里有很多答案。在初步查看您的代码后,我会synchronized 整个方法。还有很多其他的技术。就像在该项目或整个表上添加数据库锁,使用事务。您可以使用休眠并进行乐观锁定。
-
附带说明,我不会返回调用代码必须检查的成功或失败值。如果无法租用该工具,我会抛出异常。它将减少调用代码对
toolHire方法内部的依赖。 -
有没有办法避免同步整个方法,只要使用不同的工具,预订就可以不间断地进行。
-
答案是肯定的,但它需要使用数据库事务和表/行锁或乐观锁。在我们的团队中,我们使用 Springs @Transactional 注解和 Hibernate 的 Optimistic Locking 策略来完成此类工作。
标签: java multithreading concurrency thread-safety locking