簡體   English   中英

簡單 Java 服務中的並發問題

[英]Concurrency issue in a simple Java service

  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 對象上進行同步,這將創建一個所有實例都將用於同步的對象。

您是否有多個 ToolHireInstances 分布在多個進程中,每個進程都有客戶端(並且您的數據庫有一個 JDBC 連接器)? 在這種情況下,您可能希望通過使整個方法存在於 SQL 事務中來將事務部分推入 JDBC。 這需要重新組織您的代碼以公開事務元素。 您需要決定執行此原子 pull_tool->evaluate_status->save_hiring_decision 所需的 SQL 隔離級別。

您是否有多個 ToolHireInstance 分布在多個進程中,每個進程都有客戶端(並且沒有JDBC 連接器)? 請咨詢您的數據庫,了解存在哪些類型的事務方法。 如果不存在,您將需要使用某種其他類型的外部同步工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM