呼叫等待是否安全;通知Play Framework管理的对象(JPA / Hibernate后端)?

时间:2011-04-13 10:58:03

标签: hibernate jpa concurrency playframework

假设我有一个简单的模型

package models;

import javax.persistence.Entity;
import play.db.jpa.Model;

@Entity
public class Chart extends Model {

    public String name;

    @Lob
    public String json;
}

现在,如果我要在方法中从Chart类中检索一个对象,如下所示

Chart c = Chart.findById(1L);
doSomethingWithChartAndLetMeKnow(c)
c.wait();

现在在这个doSomethingWithChartAndLetMeKnow方法中,一旦我完成处理,我就可以调用c.notifyAll(),并且可能原始方法将继续执行。

但是,如果完全不同的方法执行以下操作

Chart c = Chart.findById(1L);
c.notifyAll();

在doSomethingWithChartAndLetMeKnow方法上等待的原始线程是否会被唤醒?

2 个答案:

答案 0 :(得分:1)

不,它不会唤醒原始线程。

这两个请求由单独的会话处理。在不同会话中检索的实体不是相同的Java对象。

但是,您应该查看Play!的异步支持,而不是使用notify()和wait(): http://www.playframework.org/documentation/1.2/asynchronous

答案 1 :(得分:0)

我认为这是错误的:

  

现在就在这   doSomethingWithChartAndLetMeKnow   方法,一旦我完成处理,我   大概可以调用c.notifyAll()   原始方法将继续   执行。

因为你会在等待之前调用notify。一旦它在方法调用下等待,它将等待另一个通知。

那就是说,我不建议以这种方式在任何Web应用程序中使用线程。查看Akka或某个Actor-model库。它会使事情变得更简单。