单例相关比较:
第一种方式:预先加载的问题,可能在没有手动创建对象的时候已经实例化了变量
private final static UserService userService = new UserService();
private UserService() {
}
public static final UserService getInstance() {
return userService;
}
第二种方式:排队现象比较严重,会出现性能问题
private static UserService userService = null;
private UserService() {
}
public static synchronized UserService getInstance() {
if(userService == null) {
userService = new UserService();
}
return userService;
}
第三种方式:容易造成创建多个对象的问题,特别第一创建对象的时候,另外一个线程 已经进入if(userService == null)等候synchronized, 执行完毕,然后会创建第二个实例,单例失效
private static UserService userService = null;
private UserService() {
}
public static UserService getInstance() {
if(userService == null) {
synchronized(UserService.class) {
userService = new UserService();
}
}
return userService;
}
第四种方式:避免了第三种创建多个实例的现象,并且避免了多个线程排队等候的现象(比较推荐使用)
private static UserService userService = null;
private UserService() {
}
public static UserService getInstance() {
if(userService == null) {
synchronized(UserService.class) {
if(userService == null)
userService = new UserService();
}
}
return userService;
}