如何在不影响java效率的情况下实现线程同步

时间:2012-01-12 11:34:55

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

假设使用以下功能:

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

此处的同步不是正确的工具,因为如果您的应用是群集的,或者该对象是由其他应用甚至其他方法修改的,则同步不会产生任何影响。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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