我使用@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()内部传递的布尔值出现竞争条件?
嗯,这只是一个疑问,到目前为止没有竞争条件发生,我只想清除疑点。谢谢答案 0 :(得分:1)
不,该代码中没有任何竞争条件(从Java的角度来看),因为boolean的范围是方法调用。如果布尔值是实例或类属性,那么您可能遇到并发问题。理想情况下,您的服务应该是无国籍的,以避免竞争条件,如果不是,您需要使类同步或使用concurrent package中的深奥内容。
如果要阻止2个用户在数据库中编写/更新相同的记录,则需要使用锁定机制,例如optimistic locking或pessimistic locking。链接转到hibernate文档,但大多数ORM都支持这两种锁定机制。