gpt4 book ai didi

java - 简单Java服务中的并发问题

转载 作者:行者123 更新时间:2023-12-01 18:39:16 25 4
gpt4 key购买 nike

  1. 在下面的 Java ToolHireService 中,如何以最佳方式防止同一工具被多个客户雇用的并发问题。仅当评估同一工具以供雇用时,它才应“阻止线程”。

  2. 有关如何编写失败测试的任何指示吗?

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:只要使用不同的工具,预订就应该能够不间断地进行。

最佳答案

一如既往,答案是视情况而定。

您在一个进程中是否有多个客户端正在使用的单个 ToolHireInstance?在这种情况下,只需同步整个方法就足够了。

您在一个进程中是否有多个 ToolHireInstances 被多个客户端使用?在这种情况下,您可以在 ToolHireService.class 对象上进行同步,这将创建一个所有实例将用于同步的对象。

您是否有多个 ToolHireInstance 分布在多个进程中,每个进程都有客户端(并且您的数据库有 JDBC 连接器)?在这种情况下,您可能希望通过使整个方法存在于 SQL 事务中来将事务部分推送到 JDBC 中。这需要重新组织代码以公开事务元素。您需要决定执行此原子性 pull_tool->evaluate_status->save_hiring_decision 所需的 SQL 隔离级别。

您是否有多个 ToolHireInstance 分布在多个进程中,每个进程都有客户端(并且没有 JDBC 连接器)?请查询您的数据库以了解存在哪些类型的交易方法。如果不存在,您将需要使用其他类型的外部同步工具。

关于java - 简单Java服务中的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59975320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com