【问题标题】:How to achieve thread synchronizing without effecting the efficiency in javajava中如何在不影响效率的情况下实现线程同步
【发布时间】:2012-02-08 16:50:48
【问题描述】:

用下面的函数说:

getUnique(){
    MyObject obj = getValueFromDb();
    obj.modifyIt();
    obj.commit();
}

当同时调用此方法时,多个线程共享相同的 MyObject 值,但我希望每个线程都有唯一的值。

为了解决这个问题,我使用class.getInstance().myMethodCall() 使用线程同步来获取某些属性的唯一值,这解决了目的,但是随着同时调用的到来,它降低了函数的效率。

有没有更好的方法来解决这个问题? (使用STRUTS,HIBERNATE3.0)

【问题讨论】:

  • 了解 myMethodCall 中的内容会有所帮助:您如何连接到数据库?您在共享连接吗?
  • @savinos 除了属性上的一些变化外,什么都没有。可以假设 Hibernate 事务在方法启动时启动,并在方法调用结束时提交。
  • 是的 getValueFromDb() 已同步
  • 您是否使用诸如 Hibernate 之类的持久性 API 来执行您的数据访问?如果是这样,重复值可能是由于缓存造成的。
  • @mcfinnigan 使用 HIBERNATE3.0

标签: java hibernate synchronization thread-safety thread-synchronization


【解决方案1】:

使用 Hibernate,每个线程都有自己的会话,每个会话都有不同的对象集。因此,每个线程都有自己的 MyObject 副本。数据库将为您处理并发修改。如果您想禁止两个线程同时修改同一个对象,请使用带有@Version 字段的乐观并发,如 Hibernate 文档中所述。

同步在这里不是正确的工具,因为如果你的应用程序是集群的,或者如果对象被另一个应用程序甚至其他方法修改,同步将没有任何效果。

【讨论】:

    【解决方案2】:

    我想对你说两件事,首先是@Umesh 指出的,每个线程都有自己的 MyObject 副本,它们不共享副本

    其次,函数 getValueFromDb() 也是外部的,您是否确保 getValueFromDb() 也是同步的。如果不?那么你也应该同步它。

    另外,myMethodCall() 里面是什么???它返回的值是否与 getValueFromDb() 返回的值相同??

    【讨论】:

    • yes getValueFromDb() 已同步且 cmets 已发布到 Umesh
    【解决方案3】:

    您认为“多个线程共享相同的 MyObject 值”的假设是错误的。 MyObject 不是实例变量,因此不会与其他线程共享。

    【讨论】:

    • MyObject 有一个由 getValueFromDb 接收的值,当线程正在处理中并且在它尝试提交另一个线程并访问方法之前,两个线程共享相同的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多