2012-02-16 3 views
1

Рассмотрите ситуацию, когда у нас есть контроллер с двумя методами действий, которые используют одно и то же поле контроллера. Это поле должно быть лениво инициализировано.Синхронизация поля в игре! Контроллеры

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? Считайте, что ресурс должен быть ленивым инициализирован.

Спасибо, Адриан

ответ

0

Там нет никакой разницы с ленивым загруженным классом (поля) в Play или в других контейнерах сервлет (кот и т.д.), которые используют регулярные сервлет. Ваш код с двойной проверкой-блокировкой должен работать нормально. Но я предлагаю вам избежать двойной проверки-блокировки (даже если она не сломана), просто сделайте ваш метод синхронизированным.