Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单Java服务中的并发问题_Java_Multithreading_Concurrency_Thread Safety_Locking - Fatal编程技术网

简单Java服务中的并发问题

简单Java服务中的并发问题,java,multithreading,concurrency,thread-safety,locking,Java,Multithreading,Concurrency,Thread Safety,Locking,在下面的Java ToolHireService中,如果同一个工具可以被多个客户机租用,如何以最佳方式防止并发问题。仅当同一工具正在评估租用时,才应“阻止螺纹” 有关于如何编写失败测试的指针吗 PS:只要使用不同的工具,预订就应该能够不间断地进行。答案一如既往,视情况而定 您是否在多个客户端正在使用的一个流程中有一个ToolHireInstance?在这种情况下,只需同步整个方法就足够了 您是否在一个进程中有多个ToolHireInstance供多个客户端使用?在这种情况下,您可以在ToolHi

在下面的Java ToolHireService中,如果同一个工具可以被多个客户机租用,如何以最佳方式防止并发问题。仅当同一工具正在评估租用时,才应“阻止螺纹”

  • 有关于如何编写失败测试的指针吗


  • 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();
    
        }
    }