定义:
一个类只有一个实例,而且可以自行实例化并像整个系统提供这个实例
例:饿汉式
public class Single{
public Single single = new Single();
private Single(){}
public static Single getInstance(){
return single;
}
public static void doSomething(){
}
}
私有化构造避免重复创建对象
单例中的方法多为静态方法
优点:
a:减少内存开支,因为只有一个对象
b:减少系统创建对象开销
c:避免对资源的多重占用
d:优化共享资源的访问
缺点:
a:不利于扩展
b:与单一原则冲突
c:并行项目开发,单例类没有创建无法测试
单例模式注意事项
并发情况下使用单例
懒汉和饿汉模式,区别在于懒汉模式在需要的时候创建,线程可能不安全
饿汉模式在类加载时候创建,线程安全
懒汉式
例
1.方法加同步锁
public class Single{
private Single(){}
private static Single single;
public static synchronized Single getInstance(){
if(single == null){
single = new Single();
}
return single;
}
}
2.同步锁双层判断DCL模式
volatile在1.5后java的加载方式发生变化,所以可能会出现指令集乱序问题
public class Single{
private Single(){}
private static volatile Single single;
public static Single getInstance(){
if(single == null){
synchronized (Single.class){
if(single == null){
single = new Single();
}
}
}
return single;
}
}
3.内部类实现方案,避免了同步锁带来的效率问题
public static Single{
private Single(){}
private static class SingleHolder{
private static final Single INSTANCE = new Single();
}
public static final Single getSingle(){
return SingleHolder.INSTANCE;
}
}
饿汉式
例子同本页开始方式
登记式
Spring模式
TODO:以后懂了在写