Полевая синхронизация в Play! Контроллеры
Рассмотрим ситуацию, когда у нас есть контроллер с двумя методами действия, которые используют одно и то же поле контроллера. Это поле должно быть лениво инициализировано.
public class SomeController extends Controller {
private static volatile Resource resource;
private static Resource getResource() {
if (resource == null) {
synchronized (SomeController.class) {
if (resource == null) {
resource = new Resource();
}
}
}
return resource;
}
public static void action1() {
getResource().doSomeAction();
}
public static void action2() {
getResource().doSomeAnotherAction();
}
}
Как лучше синхронизировать общие ресурсы с помощью Play Framework? Учтите, что ресурс должен быть ленивым инициализирован.
Спасибо Адриан
1 ответ
Нет разницы с классом (полем) с отложенной загрузкой в Play или других контейнерах сервлетов (tomcat и т. Д.), Которые используют обычные сервлеты. Ваш код с двойной проверкой блокировки должен работать нормально. Но я предлагаю вам избежать двойной проверки блокировки (даже если она не сломана), просто сделайте ваш метод синхронизированным.