我有以下 JAVA 代码,它根据从数据库收到的最大请求数生成请求数。
synchronized (this) {
System.out.println("stsrt");
certRequest.setRequestNbr(generateRequestNumber(certInsuranceRequestAddRq
.getAccountInfo().getAccountNumberId()));
System.out.println("outside funcvtion"+certRequest.getRequestNbr());
ItemIdInfo itemIdInfo = new ItemIdInfo();
dao.insert(certRequest);
System.out.println("end");
}
为了理解流程,我在代码中添加了 System.out.println()
语句,其结果如下:
stsrt
stsrt
inside function request number37
outside funcvtion37
inside function request number37
outside funcvtion37
end
end
“内部函数请求”描述了我的函数调用generateRequestNumber()
,它根据数据库生成请求号。
如果您注意到 System.out.println() 语句,当两个线程同时运行时,两个线程一起输入同步代码(因为我在开始时将“stsrt”语句放在一起) ,两个线程也一起退出代码(因为我在最后得到了“end”语句)。
问题:如何同步我的代码,以便第一个线程完成执行,然后另一个线程完成执行?
最佳答案
这取决于您同步的内容。
当您执行synchronized (this) {}
时,它会将 block 与this
对象同步。这意味着 2 个(或更多)线程无法同时使用同一对象访问该 block 。
但在您的示例中,您似乎正在使用不同的对象同时访问该方法。因此它可以并行访问它们。
如果您想在所有对象之间同步,请在类中使用static Final Object
并与该对象同步。
喜欢,
class Test {
private static final Object obj = new Object();
public void method() {
...
synchronized(obj) {
...
}
}
}
然后它将在所有对象之间同步。
关于Java代码同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31933294/