【问题标题】:Java code Synchronization issuesJava 代码同步问题
【发布时间】:2015-08-11 04:34:45
【问题描述】:

我有以下 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”语句),两个线程也一起退出代码(如我把“结束”语句放在最后)。

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

【问题讨论】:

  • 你在使用任何框架吗?您可以将此类设为单例。
  • 并展示你是如何多次调用这段代码的(显示在你的输出中)?
  • Naman,我无法做到单身
  • 将您的第一个输出更改为:System.out.println("start " + System.identityHashCode(this)); 并发布结果。
  • 好的。因此,您有多个 ABC.java 类实例,因此 synchronized (this) 无法按预期工作。您可以检查您的前端代码,因为您可能正在执行new (ABC),这会导致 ABC 类的独立对象。

标签: java multithreading hibernate


【解决方案1】:

这取决于您同步的内容。

当您执行synchronized (this) {} 时,它会将块与this 对象同步。这意味着 2 个(或更多)线程不能同时使用 same object 访问该块。

但在您的示例中,您似乎正在使用 不同的对象 同时访问该方法。因此它可以并行访问它们。

如果您想在所有对象之间进行同步,请在您的类中使用 static final Object 并与该对象同步。

喜欢,

class Test {
    private static final Object obj = new Object();
    public void method() {
        ...
        synchronized(obj) {
            ...
        }
    }
}

然后它将在所有对象之间进行同步。

【讨论】:

    【解决方案2】:

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

    synchronized (this.getClass())
    

    【讨论】:

    • 这有助于我进行多线程调用。以下是我的 system.out.println() 结果。 stsrt inside function request number38 outside funcvtion38 D98F571C-F92E-4B3D-BB34-9260A5708FE5 end stsrt inside function request number38 outside funcvtion38 D1D34D96-1124-4B8E-9A22-A63E1A2B77BC end。但是我仍然得到相同的请求号。是因为在数据库中保存详细信息需要时间吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多