单例模式:保证一个类只有一个实例,并提供全局的一个访问对象
优点:
节省系统资源,不用频繁创建对象
资源共享,使用同一个实例,不会存在信息不匹配
实现:
1、饿加载(饿汉模式)
即在系统初始化时,便生成对象,线程安全
/**
* 饿加载单例
*/
public class HungrySingle {
private static HungrySingle hungrySingle = new HungrySingle();
public static HungrySingle getHungrySingle(){
return hungrySingle;
}
private HungrySingle(){
}
}
2、懒加载(懒汉模式)
即系统初始化时不生成对象,使用对象时,才生成对象,线程不安全(当线程A判断对象null时,会去创建对象,这时线程B访问,对象还未创建,线程B会再去创建对象,所以懒加载是线程不安全的)
/**
* 懒加载单例
*/
public class LazyLoadingSingle {
private static LazyLoadingSingle lazyLoadingSingle;
public static LazyLoadingSingle getLazyLoadingSingle(){
if (lazyLoadingSingle == null){
lazyLoadingSingle = new LazyLoadingSingle();
}
return lazyLoadingSingle;
}
private LazyLoadingSingle(){
}
}
3、枚举创建
枚举创建也是线程安全的,这个方法其实是用到了枚举构造方法只会执行一次的特性
/**
* 枚举单例
*/
public class EnumSingle {
public static EnumSingle getEnumSingle(){
return DemoSingleEnum.INSTANCE.enumSingle;
}
private enum DemoSingleEnum{
INSTANCE;
private EnumSingle enumSingle;
public EnumSingle getEnumSingle(){
return enumSingle;
}
DemoSingleEnum(){
enumSingle = new EnumSingle();
}
}
private EnumSingle(){
}
}
最后测试结果,不管方法调用几次,获取到的都是同一个对象