gpt4 book ai didi

java - 锁定Java任务

转载 作者:行者123 更新时间:2023-11-30 07:39:23 25 4
gpt4 key购买 nike

我测试了在 hibernate 调用中同时运行两个任务。它错误地创建了两个具有相同案例编号的对象。我想锁定此方法,直到 object1 获取其案例编号,然后 object2 将获得不同的案例编号。

public String getNextCaseNumberFromDatabase(String tenantId) {

LOGGER.entering(getClass().getName(), "getNextCaseNumber");

Configuration caseNumberStartValueConfiguration = null;
List<Case> cases = null;

try {
caseNumberStartValueConfiguration = configurationService.getConfigurationByKey(ConfigurationKey.CASE_NUMBER_START_VALUE, tenantId);
} catch (RuntimeException ex) {
throw ex;
}

try {
cases = caseService.getAllCases(tenantId);
} catch (RuntimeException ex) {
throw ex;
}

//LOCK DATABASE HERE
synchronized(this) {
// Get the largest case number in the database and increment from it
int largestCaseNumber = 0;
for (int i = 0; i < cases.size(); i++) {
if (cases.get(i).getCaseNumber() != null) {
if (Integer.parseInt(cases.get(i).getCaseNumber()) > largestCaseNumber) {
largestCaseNumber = Integer.parseInt(cases.get(i).getCaseNumber());
}
}
}

// Set the case number to either the next largest number or the configured value, whichever is larger
String caseNumber = "1";
if (largestCaseNumber >= Integer.parseInt(caseNumberStartValueConfiguration.getConfigurationValue())) {
caseNumber = Integer.toString(largestCaseNumber + 1);
} else if (caseNumberStartValueConfiguration != null) {
caseNumber = caseNumberStartValueConfiguration.getConfigurationValue();
}


LOGGER.exiting(getClass().getName(), "getNextCaseNumber");
return caseNumber;
}//END LOCK HERE

}

如你所见,我添加了同步(this){}它什么也没做。知道我需要做什么不同的事情才能正确锁定它吗?我需要锁定整个方法吗?

最佳答案

以这种方式进行同步

public synchronized String getNextCaseNumberFromDatabase(String tenantId)  {

}

与这样进行同步是一样的

public String getNextCaseNumberFromDatabase(String tenantId)  {
syncronized(this) {

}
}

两种情况都使用this进行同步。正如 @MarkTucker 所建议的“两个线程中的‘this’是不同的,因此同步没有做任何事情”。您需要一个静态字段来同步它

    private static Object sync = new Object();

public String getNextCaseNumberFromDatabase(String tenantId) {
syncronized(sync) {

}
}

但这不是最好的方法。尝试仅使用一行作为数据库中的最大案例编号,并获取事务中的下一个案例编号。

  1. 打开交易。

  2. 使用悲观锁定获取当前案例编号(LockMode.PESSIMISTIC_WRITE 或类似的,它取决于 Hibernate版本)

    session.get(CaseNumber.class, caseNumberId, LockMode.PESSIMISTIC_WRITE)

  3. 增加案例编号并更新 CaseNumber

  4. 提交交易。

  5. 返回递增的案例编号。

其他线程将等待事务提交。

关于java - 锁定Java任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34909186/

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