Безопасно ли вызывать wait

#hibernate #jpa #concurrency #playframework

#переход в спящий режим #jpa #параллелизм #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?

Ответ №1:

Нет, это не привело бы к запуску исходного потока.

Два запроса обрабатываются отдельными сеансами. Объекты, извлеченные в разных сеансах, не являются одним и тем же объектом Java.

Однако вам следует проверить поддержку асинхронности Play! вместо использования notify() и wait ():http://www.playframework.org/documentation/1.2/asynchronous

Комментарии:

1. Является ли это гарантией того, что объект, извлеченный в разных сеансах, является разными объектами Java? Или это то, что обычно происходит?

Ответ №2:

Я думаю, что это неправильно:

Теперь в этом методе doSomethingWithChartAndLetMeKnow, как только я закончу обработку, я могу вызвать c.notifyAll() и, предположительно, исходный метод продолжит выполнение.

поскольку вы бы вызывали notify перед ожиданием. Как только он переходит в режим ожидания при вызове метода, он будет ждать другого уведомления.

Тем не менее, я бы не рекомендовал использовать потоки в любом веб-приложении таким образом. Проверьте Akka или какую-нибудь библиотеку Actor-model. Это упростит задачу.