Полевая синхронизация в 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 и т. Д.), Которые используют обычные сервлеты. Ваш код с двойной проверкой блокировки должен работать нормально. Но я предлагаю вам избежать двойной проверки блокировки (даже если она не сломана), просто сделайте ваш метод синхронизированным.

Другие вопросы по тегам