Java代码同步问题

标签 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() 语句,当两个线程同时运行时,两个线程一起输入同步代码(因为我在开始时将“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/

相关文章:

hibernate - GORM/hibernate :将标准加入(转换)到属性(property)的 child 的准则

java - 使用 RCP 或 FTP 将文件从远程 UNIX 计算机复制到本地 Windows 计算机

java - 程序执行停止且不产生错误

c# - 这个阻塞线程如何调用 "freeing"本身?

java - 终止并向 Executor 提交可调用对象

c++ - 当 Execute() 在 C++ Builder 中终止时,不调用 OnTerminate() 方法

java - @UniqueConstraint 用于两列以上

java - Hibernate 将数据保存到数据库时出现的问题

java - 发送给所有客户端java

Java:将图像保存到文件目录而不退出应用程序