单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
饿汉式
先初始化对象,类在加载内存时候创建对象1
2
3
4
5
6
7public class Single{
private Single(){}
private static final Single single = new Single();
public static Single getInstance(){
return single;
}
}
懒汉式
方法被调用时才初始化对象,对象的延迟加载1
2
3
4
5
6
7
8
9
10public class Single{
private static Single single = null;
private Single(){}
public static synchronized Single getInstance(){
if(single == null){
single = new Single();
}
return single;
}
}
这样的懒汉模式每次调用都会同步,会影响性能,所以又产生了DCL(双重锁模式)1
2
3
4
5
6
7
8
9
10
11
12
13
14public class Single{
private volatite static Single single = null;
private Single(){}
public static Single getInstance(){
if(single == null){
synchronized(Single.class){
if(single == null){
single = new Single();
}
}
}
return single;
}
}
如果不加volatile可能会出现问题,这是由于Jdk5以后支持处理器乱序执行汇编指令,导致指向地址和实例化堆区顺序不同,这时候可能在实例化的过程中其引用已经指向堆内存了,而其地址尚未返回,这时候再做赋值的话,会造成其引用为null的假象
内部类的单例模式
其优点在于随用随加载1
2
3
4
5
6
7
8
9
10
11
12public class InnnerClassSingle {
private InnnerClassSingle() {
}
private static class SingleHodler {
private static final InnnerClassSingle instance=new InnnerClassSingle();
}
public static InnnerClassSingle getInstance() {
return SingleHodler.instance;
}
}
枚举单例模式
反序列化的时候只会有一个枚举生成
枚举中的属性必须放在最前面
枚举中可以和java类一样定义方法
枚举中的构造方法必须是私有的1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public enum EnumManager {
SDCardManager(10) {
public EnumManager getSingle() {
return SDCardManager;
}
},
HttpManager(1) {
public EnumManager getSingle() {
return null;
}
};
public SdCardImpl getSingleton() {
return new SdCardImpl();
}
public abstract EnumManager getSingle();
private EnumManager(int type) {
}
}
使用枚举中的单利1
EnumManager.SDCardManager.getSingleton();