1
我测试了在我的hibernate调用中同时运行两个任务。它不正确地创建两个具有相同大小写的对象。我想锁定此方法,直到object1获取其案例号,然后object2将获得不同的案例号。锁定Java任务
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
}
正如你可以看到我添加了同步(这){} 它什么都不做。任何想法,我需要做不同的正确锁定这个?我是否需要锁定整个方法?
'这'在两个线程中是不同的,所以同步没有做任何事情。蛮力的方法是同步整个方法。或者,你可以有一个静态成员对象(在CaseHelper中)并在该对象上同步(而不是'this')。 –
@MarkTucker我试图使方法“公共同步字符串getNextCaseNumberFromDatabase(字符串tenantId)”,但它仍然给重复的数字。有任何想法吗? – Jay266