Java代码同步问题

时间:2015-08-11 04:34:46

标签: java multithreading hibernate

我有以下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”语句),两个线程一起退出代码(因为我在最后得到了“结束”声明)。

问题:我如何同步我的代码,以便第一个线程完成执行然后再执行另一个?

2 个答案:

答案 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)

我怀疑,您可以在每个线程中创建objectthis表示不同的对象,因此它可以并行访问它们。您可以按照以下方式进行操作

synchronized (this.getClass())