作为一个程序猿单例模式大家再熟悉不过了.
示例
除了饿汉单例
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
懒汉式单例
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
还有登记式单例(http://shuidexiongdi.iteye.com/blog/1208099)
单例模式的优点:
1.内存中之存在一个实例,节省资源
2.避免了对象的频繁创建消除
3.可以全局访问
单例模式使用注意事项
1.构造方法必须是静态
2.不要通过反射的方式获取对象
3.在多线程的使用场景下注意并发问题.
如:懒汉式 getInstance方法在高并发的场景下是可以优化的
public class Singleton {
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null) singleton = new Singleton();
}
}
return singleton;
}
}
使用double check 替换加在方法上的synchronized 较少并发情况下资源竞争的粒度
单例模式相对静态方法的优势
1.从设计的角度来说 单例可以实现接口但是静态类不行,使用静态类那么使用者和静态类建立了直接的联系,重设计原则来说类与类之间最好你不认识我,我不认识你,解耦.使用静态类破坏了这点.
2.从初始化的角度来说 单例可以延时加载,而静态类不可以,针对初始化复杂的场景延时加载很有用
3.从线程安全的角度来说 单例相比静态类更容易处理并发问题
最后单例模式可以抽象下概念.扩大应用场景
比如在线程中单一实例. 在JVM中单一实例,在集群中单一实例.都可以称为单例.