假设使用以下功能:
getUnique(){
MyObject obj = getValueFromDb();
obj.modifyIt();
obj.commit();
}
当同时调用此方法时,多个线程共享MyObject的相同值,但我希望每个线程都具有唯一值。
为了解决这个问题,我使用class.getInstance().myMethodCall()
进行线程同步来获取某些属性的唯一值,这解决了目的,但是当同时调用它时会降低函数的效率。
有没有更好的方法来解决这个问题? (使用STRUTS,HIBERNATE3.0)
答案 0 :(得分:4)
使用Hibernate,每个线程都有自己的会话,每个会话都有一组不同的对象。因此每个线程都有自己的MyObject副本。数据库将为您处理并发修改。如果你想禁止同时修改同一个对象的两个线程,请使用带有@Version字段的乐观并发,如Hibernate文档中所述。
此处的同步不是正确的工具,因为如果您的应用是群集的,或者该对象是由其他应用甚至其他方法修改的,则同步不会产生任何影响。
答案 1 :(得分:1)
您认为“多个线程共享MyObject的相同值”是错误的。 MyObject不是实例变量,因此不会与其他线程共享。
答案 2 :(得分:0)
我想对你说两件事,首先是@Umesh指出,每个线程都有自己的MyObject副本,他们不共享副本
其次,函数getValueFromDb()也是外部函数,您是否确保getValueFromDb()也是同步的。如果不?那么你也应该同步它。
另外,myMethodCall()里面是什么???它是否返回getValueFromDb()返回的相同值?