2

说使用以下功能:

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

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

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

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

4

3 回答 3

4

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

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

于 2012-01-12T11:59:35.047 回答
1

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

于 2012-01-12T11:45:42.093 回答
0

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

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

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

于 2012-01-12T11:52:09.720 回答