理解@service和竞争条件

时间:2011-03-08 12:11:47

标签: java spring spring-mvc

我使用@service注释一个类。我的@controller类将通过@autowired调用@service。任何人都可以在@service类中预见的任何竞争条件,方法?

如果我在@service中有方法

public boolean dosomethinglongtime(){
boolean passed=false;
//write to database...
//do very long task;
//if all task success, passed=true;

return passsed
} 

调用控制器并调用此方法的2个不同用户的任何可能性都会导致dosomethinglongtime()内部传递的布尔值出现竞争条件?

嗯,这只是一个疑问,到目前为止没有竞争条件发生,我只想清除疑点。谢谢

1 个答案:

答案 0 :(得分:1)

不,该代码中没有任何竞争条件(从Java的角度来看),因为boolean的范围是方法调用。如果布尔值是实例或类属性,那么您可能遇到并发问题。理想情况下,您的服务应该是无国籍的,以避免竞争条件,如果不是,您需要使类同步或使用concurrent package中的深奥内容。

如果要阻止2个用户在数据库中编写/更新相同的记录,则需要使用锁定机制,例如optimistic lockingpessimistic locking。链接转到hibernate文档,但大多数ORM都支持这两种锁定机制。