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;
    }
}
它使用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;
    }
}
但是,我更喜欢Just Create One成语.
更新:正如您的问题历史记录所证实的那样,您正在使用Java EE.如果你的容器支持它,你也可以把它变成一个@SingletonEJB并用@EJB它来注入它(尽管@Stateless是优选的,因为@Singleton默认情况下是读锁定的).
@Singleton
public class UserService {}
例如在JSF托管bean中
@EJB
private UserService userService;
这样,您可以将实例化作业委派给容器.
| 归档时间: | 
 | 
| 查看次数: | 8548 次 | 
| 最近记录: |