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

标签 java multithreading concurrency thread-safety locking

  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/

相关文章:

java - 在特定示例的 Java 说明之前发生关系

java - 线程对方法的请求计数器

java - NumberFormat.getCurrencyInstance();失败

java - 嵌套 for 循环以每行打印数组的七个元素

java - 预熔。将鼠标悬停在节点上时,如何更改连接边的可视化?

multithreading - 内核线程和用户线程之间有什么区别?

javascript - 如何将二进制消息传递给 JavaScript Web Worker 或从 JavaScript Web Worker 传递二进制消息?

java - 损坏的双链表

multithreading - 从多线程 c 应用程序调用 cuda 内核

java - 在 Java 中更新(和迭代) map