2011-04-13 35 views
2

假设我有一个简单的模型对PlayFramework(JPA/Hibernate后端)管理的对象调用wait和notify是否安全?

package models; 

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

@Entity 
public class Chart extends Model { 

    public String name; 

    @Lob 
    public String json; 
} 

现在,如果我是检索从图表类中的对象的方法如在本doSomethingWithChartAndLetMeKnow方法如下

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

现在,一旦予完成处理,我可以调用c.notifyAll(),大概原来的方法会继续执行。

但是,如果有什么完全不同的方法做了如下

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

将那个等待的doSomethingWithChartAndLetMeKnow方法原来的线程在所有唤醒?

回答

1

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

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

但是,你应该检查出该剧的异步支持,而不是使用通知()和wait(): http://www.playframework.org/documentation/1.2/asynchronous

+0

难道实体在不同会话中获取的保证是不同的Java对象?或者那是通常发生的事情? – Tony 2011-04-18 17:50:15

0

我认为这是错误的:

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

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

这就是说,我不会推荐在这种方式中使用任何Web应用程序中的线程。检查Akka或一些Actor-model库。它会让事情变得更简单。

相关问题