简单Java服务中的并发问题
在下面的Java ToolHireService中,如果同一个工具可以被多个客户机租用,如何以最佳方式防止并发问题。仅当同一工具正在评估租用时,才应“阻止螺纹”简单Java服务中的并发问题,java,multithreading,concurrency,thread-safety,locking,Java,Multithreading,Concurrency,Thread Safety,Locking,在下面的Java ToolHireService中,如果同一个工具可以被多个客户机租用,如何以最佳方式防止并发问题。仅当同一工具正在评估租用时,才应“阻止螺纹” 有关于如何编写失败测试的指针吗 PS:只要使用不同的工具,预订就应该能够不间断地进行。答案一如既往,视情况而定 您是否在多个客户端正在使用的一个流程中有一个ToolHireInstance?在这种情况下,只需同步整个方法就足够了 您是否在一个进程中有多个ToolHireInstance供多个客户端使用?在这种情况下,您可以在ToolHi
PS:只要使用不同的工具,预订就应该能够不间断地进行。答案一如既往,视情况而定 您是否在多个客户端正在使用的一个流程中有一个ToolHireInstance?在这种情况下,只需同步整个方法就足够了 您是否在一个进程中有多个ToolHireInstance供多个客户端使用?在这种情况下,您可以在ToolHireService.class对象上进行同步,该对象将创建所有实例用于同步的单个对象 您是否有多个ToolHireInstance分布在多个进程中,每个进程都有客户端(并且您的数据库有一个JDBC连接器)?在这种情况下,您希望通过使整个方法存在于SQL事务中,将事务部分推送到JDBC中。这需要重新组织代码以公开事务元素。您需要决定执行此原子拉取工具->评估状态->保存决定所需的SQL隔离级别
是否有多个ToolHireInstance分布在多个进程中,每个进程都有客户端(并且没有JDBC连接器)?请咨询您的数据库,了解存在哪种类型的事务处理方法。如果不存在外部同步工具,则需要使用其他类型的外部同步工具。这里有很多答案。在对您的代码进行了初步的了解之后,我将介绍整个方法。还有很多其他的技巧。就像在该项或整个表上使用事务添加数据库锁一样。您可以使用hibernate并执行乐观锁定。另外,我不会返回调用代码必须检查的成功或失败值。如果工具不能被出租,我会抛出一个异常。这将减少调用代码对
toolHire
方法内部的依赖性。是否有办法避免同步整个方法,因为只要使用不同的工具,预订就可以不间断地进行。答案是肯定的,但它需要使用数据库事务和表/行锁或乐观锁。在我们的团队中,我们使用Springs@Transactional annotation和Hibernate的乐观锁定策略来完成这类工作。谢谢,John。我只研究了核心java选项,其中有一个工具租用服务实例,可以由不同的线程调用。此外,我现在已经澄清了背景,通过添加“只要使用不同的工具,预订应该能够不间断地进行”来帮助关注这个问题
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();
}
}