如何实现线程同步,而无需使用下面的函数在Java中实现效率

问题描述:

说:如何实现线程同步,而无需使用下面的函数在Java中实现效率

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

当同时调用此方法提出了若干线程共享的MyObject的值相同,但我希望每个线程有一个独特的价值。

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

有一些更好的方法来解决这一问题? (使用Struts,HIBERNATE3.0)

+0

了解myMethodCall内部会有什么帮助:你如何连接到数据库?你是否分享了连接? – 2012-01-12 11:39:20

+0

@savinos除了属性的变化之外,没有什么。可以假设Hibernate事务在方法启动时开始并在方法调用结束时提交。 – Sankalp 2012-01-12 11:45:00

+0

yes getValueFromDb()已同步 – Sankalp 2012-01-12 11:55:30

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

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

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

+0

MyObject的具有由getValueFromDb并且当线程处于过程,它尝试提交另一个线程之前时和访问的方法,那么这两个线程共享相同的值接收到的值。 – Sankalp 2012-01-12 11:53:10

我想说两件事情给你,首先是因为@Umesh指出,每个线程有自己的MyObject的副本,它们之间不共享副本

;其次,功能getValueFromDb()是也是外部的,你确保getValueFromDb()也是同步的。如果不?那么你也应该同步它。

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

+0

是getValueFromDb()已同步并发布到Umesh – Sankalp 2012-01-12 11:54:59

+0

的评论和getUnique()?它是一种同步方法吗? – 2012-01-12 12:15:41