Java 场上同步!控制器

Java 场上同步!控制器,java,synchronization,playframework,lazy-initialization,Java,Synchronization,Playframework,Lazy Initialization,考虑一种情况,当我们有一个控制器,它有两个使用相同控制器字段的动作方法。此字段应延迟初始化 public class SomeController extends Controller { private static volatile Resource resource; private static Resource getResource() { if (resource == null) { synchronized (SomeC

考虑一种情况,当我们有一个控制器,它有两个使用相同控制器字段的动作方法。此字段应延迟初始化

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同步公共资源的更好方法是什么?考虑资源应该是惰性初始化的。
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();
    }

}
谢谢,
Adrian

与正在使用的延迟加载类字段或其他使用常规servlet的servlet容器tomcat等没有区别。带有双重检查锁定的代码应该可以正常工作。但我建议您避免双重检查锁定,即使它没有被破坏,只需使您的方法同步即可