我用 @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
}
两个不同的用户调用 Controller 并调用此方法是否有可能导致 dosomethinglongtime() 内传递的 boolean 值出现竞争条件?
好吧,这只是一个疑问,到目前为止还没有发生竞争条件,我只是想澄清这个疑问。谢谢你
最佳答案
不,该代码中不会出现任何竞争条件(从 Java 的角度来看),因为 boolean 值的范围仅限于方法调用。如果 boolean 值是实例或类属性,那么您可能会遇到并发问题。理想情况下,您的服务应该是无状态的,以避免竞争条件,如果不是,您需要使类同步或使用concurrent package中的深奥内容。 .
如果你想阻止2个用户在数据库中写入/更新相同的记录,你需要使用锁定机制,例如optimistic locking ,或pessimistic locking 。这些链接指向 hibernate 文档,但大多数 ORM 支持这两种锁定机制。
关于java - 了解@service 和竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5232260/