我有以下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()
语句,当两个线程同时运行时,两者一起输入Synchronized代码(因为我在开头一起得到“stsrt”语句),两个线程一起退出代码(因为我在最后得到了“结束”声明)。
问题:我如何同步我的代码,以便第一个线程完成执行然后再执行另一个?
答案 0 :(得分:2)
这取决于您与之同步的内容。
执行synchronized (this) {}
时,它会将块与this
对象同步。这意味着2个(或更多)线程无法同时使用同一个对象访问该块。
但是在您的示例中,您似乎正在使用不同的对象来同时访问该方法。因此它可以并行访问它们。
如果要在所有对象之间进行同步,请在类中使用static final Object
并与该对象同步。
像,
class Test {
private static final Object obj = new Object();
public void method() {
...
synchronized(obj) {
...
}
}
}
然后它将在所有对象之间同步。
答案 1 :(得分:1)
我怀疑,您可以在每个线程中创建object
,this
表示不同的对象,因此它可以并行访问它们。您可以按照以下方式进行操作
synchronized (this.getClass())