如何实现线程同步,而无需使用下面的函数在Java中实现效率
说:如何实现线程同步,而无需使用下面的函数在Java中实现效率
getUnique(){
MyObject obj = getValueFromDb();
obj.modifyIt();
obj.commit();
}
当同时调用此方法提出了若干线程共享的MyObject的值相同,但我希望每个线程有一个独特的价值。
为了解决这个问题,我使用线程同步,使用class.getInstance().myMethodCall()
来获得某个属性的唯一值,这解决了这个目的,但是当同时调用时它会降低函数的效率。
有一些更好的方法来解决这一问题? (使用Struts,HIBERNATE3.0)
与Hibernate,每个线程都有自己的会话,每个会话都有一组不同的对象。每个线程都有自己的MyObject副本。数据库将为您处理并发修改。如果您想禁止两个线程在同一时刻修改同一个对象,请使用开放式并发和@Version字段,如Hibernate文档中所述。
同步是不正确的工具,在这里,因为如果您的应用程序是群集,或者如果对象被另一个应用程序甚至另一个方法修改,同步将不会有任何效果。
你的假设,即“多个线程共享的MyObject的相同值”是错误的。 MyObject不是一个实例变量,因此它不会与其他线程共享。
MyObject的具有由getValueFromDb并且当线程处于过程,它尝试提交另一个线程之前时和访问的方法,那么这两个线程共享相同的值接收到的值。 – Sankalp 2012-01-12 11:53:10
我想说两件事情给你,首先是因为@Umesh指出,每个线程有自己的MyObject的副本,它们之间不共享副本
;其次,功能getValueFromDb()是也是外部的,你确保getValueFromDb()也是同步的。如果不?那么你也应该同步它。
而且,里面是什么myMethodCall()???它是否返回getValueFromDb()返回的相同值?
是getValueFromDb()已同步并发布到Umesh – Sankalp 2012-01-12 11:54:59
的评论和getUnique()?它是一种同步方法吗? – 2012-01-12 12:15:41
了解myMethodCall内部会有什么帮助:你如何连接到数据库?你是否分享了连接? – 2012-01-12 11:39:20
@savinos除了属性的变化之外,没有什么。可以假设Hibernate事务在方法启动时开始并在方法调用结束时提交。 – Sankalp 2012-01-12 11:45:00
yes getValueFromDb()已同步 – Sankalp 2012-01-12 11:55:30