Java中线程安全单例的工厂

Dav*_*ple 10 java singleton multithreading factory

这是我一直用于工厂的基本模式的示例,它返回一个线程安全的Singleton:

public class UserServiceFactory {

    private volatile static UserService userService;

    private UserServiceFactory() { }

    public static UserService getInstance() {
        if (userService == null) {
            synchronized(UserServiceImpl.class) {            
                if (userService == null) {
                    userService = new UserServiceImpl();
                }        
            }
        }

        return userService;
    }

}
Run Code Online (Sandbox Code Playgroud)

它使用volatile和double check惯用法来确保创建单个实例并在线程中可见.

是否有更简洁和/或更便宜的方式来实现1.6+中的相同目标.

Bal*_*usC 19

使用Initialization On Demand Holder习语,它更简单,更易读:

public class UserServiceFactory {

    private UserServiceFactory () {}

    private static class UserServiceHolder {
        private static final UserService INSTANCE = new UserService();
    }

    public static UserService getInstance() {
        return UserServiceHolder.INSTANCE;
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢Just Create One成语.


更新:正如您的问题历史记录所证实的那样,您正在使用Java EE.如果你的容器支持它,你也可以把它变成一个@SingletonEJB并用@EJB它来注入它(尽管@Stateless是优选的,因为@Singleton默认情况下是读锁定的).

@Singleton
public class UserService {}
Run Code Online (Sandbox Code Playgroud)

例如在JSF托管bean中

@EJB
private UserService userService;
Run Code Online (Sandbox Code Playgroud)

这样,您可以将实例化作业委派给容器.