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)
这样,您可以将实例化作业委派给容器.
| 归档时间: |
|
| 查看次数: |
8548 次 |
| 最近记录: |